---
search:
  tags:
    - Market Lifecycle
    - SEND
seo:
  description: >-
    Change-only notifications when markets are published, change trading status,
    or leave the catalog. Reference for the send operation on /ws in the
    WebSocket API.
sidebar:
  label: Stream Market Lifecycle Events
  badge: SEND
title: Stream Market Lifecycle Events
type: openapi-operation
---
Change-only notifications when markets are published, change trading status, or leave the catalog.

### Operation

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

#### 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

##### Market Created

A newly published market is available in the catalog.

Payload schema:

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

Example: MarketCreated

Single-leg market

```json
{
  "type": "market_created",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "unopened",
      "description": "Will the example resolve YES?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "external_ids": {
        "optic_odds": {
          "fixture_id": "20260927A1B2C3",
          "market_id": "player_points",
          "player_id": "7G8H9I0J1K2L"
        }
      }
    }
  }
}
```

Example: MultiLegMarketCreated

Multi-leg market

```json
{
  "type": "market_created",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "unopened",
      "description": "A two-leg example market.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes",
          "external_ids": {
            "optic_odds": {
              "fixture_id": "20260927A1B2C3"
            }
          }
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no",
          "external_ids": {
            "optic_odds": {
              "fixture_id": "20260927D4E5F6"
            }
          }
        }
      ]
    }
  }
}
```

##### Market Opened

Trading became available, including a reopening.

Payload schema:

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

Example: MarketOpened

Single-leg market

```json
{
  "type": "market_opened",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "open",
      "description": "Will the example resolve YES?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z"
    }
  }
}
```

Example: MultiLegMarketOpened

Multi-leg market

```json
{
  "type": "market_opened",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "open",
      "description": "A two-leg example market.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes"
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no"
        }
      ]
    }
  }
}
```

##### Market Paused

Trading was temporarily interrupted.

Payload schema:

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

Example: MarketPaused

Single-leg market

```json
{
  "type": "market_paused",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "paused",
      "description": "Will the example resolve YES?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z"
    }
  }
}
```

Example: MultiLegMarketPaused

Multi-leg market

```json
{
  "type": "market_paused",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "paused",
      "description": "A two-leg example market.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes"
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no"
        }
      ]
    }
  }
}
```

##### Market Closed

An active trading interval ended; the market may reopen.

Payload schema:

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

Example: MarketClosed

Single-leg market

```json
{
  "type": "market_closed",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "closed",
      "description": "Will the example resolve YES?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z"
    }
  }
}
```

Example: MultiLegMarketClosed

Multi-leg market

```json
{
  "type": "market_closed",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "closed",
      "description": "A two-leg example market.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes"
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no"
        }
      ]
    }
  }
}
```

##### Market Expired

Trading is terminal; the market remains in the catalog.

Payload schema:

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

Example: MarketExpired

Single-leg market

```json
{
  "type": "market_expired",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "expired",
      "description": "Will the example resolve YES?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z"
    }
  }
}
```

Example: MultiLegMarketExpired

Multi-leg market

```json
{
  "type": "market_expired",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "expired",
      "description": "A two-leg example market.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes"
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no"
        }
      ]
    }
  }
}
```

##### Market Deleted

The market left the catalog.

Payload schema:

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

Example: MarketDeleted

Single-leg market

```json
{
  "type": "market_deleted",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "expired",
      "description": "Will the example resolve YES?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z"
    }
  }
}
```

Example: MultiLegMarketDeleted

Multi-leg market

```json
{
  "type": "market_deleted",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "expired",
      "description": "A two-leg example market.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes"
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no"
        }
      ]
    }
  }
}
```

##### Market Metadata Updated

The market changed without a trading transition.

Payload schema:

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

Example: MarketDescriptionEdited

Single-leg market

```json
{
  "type": "market_metadata_updated",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MARKET-C",
      "status": "open",
      "description": "Will the example resolve YES before the deadline?",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "external_ids": {
        "optic_odds": {
          "fixture_id": "20260927A1B2C3",
          "market_id": "player_points",
          "player_id": "7G8H9I0J1K2L"
        }
      }
    }
  }
}
```

Example: MultiLegMarketDescriptionEdited

Multi-leg market

```json
{
  "type": "market_metadata_updated",
  "sid": 12,
  "seq": 3,
  "msg": {
    "market": {
      "ticker": "UDX-EXAMPLE-MULTI",
      "status": "open",
      "description": "A two-leg example market, priced from the YES side.",
      "tick_size": "0.001",
      "minimum_price": "0.001",
      "maximum_price": "0.990",
      "expires_at": "2026-10-01T00:00:00.000000Z",
      "legs": [
        {
          "ticker": "UDX-EXAMPLE-MARKET-A",
          "outcome": "yes",
          "external_ids": {
            "optic_odds": {
              "fixture_id": "20260927A1B2C3"
            }
          }
        },
        {
          "ticker": "UDX-EXAMPLE-MARKET-B",
          "outcome": "no",
          "external_ids": {
            "optic_odds": {
              "fixture_id": "20260927D4E5F6"
            }
          }
        }
      ]
    }
  }
}
```

#### 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/MarketCreatedEnvelope`

```yaml
type: object
additionalProperties: false
description: A newly published market.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_created
    description: Identifies a newly published market.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```

##### `#/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/MarketLifecyclePayload`

```yaml
type: object
additionalProperties: false
description: The complete market representation, matching REST. For market_deleted this is the last representation before removal.
required:
  - market
properties:
  market:
    $ref: "#/components/schemas/Market"
```

##### `#/components/schemas/Market`

```yaml
type: object
additionalProperties: false
description: A tradable binary market.
required:
  - ticker
  - status
properties:
  legs:
    type: array
    minItems: 2
    description: Present only for multi-leg markets; absent for single-leg markets. Each leg selects a component market outcome.
    items:
      $ref: "#/components/schemas/MarketLeg"
  ticker:
    $ref: "#/components/schemas/Ticker"
  description:
    type: string
    maxLength: 2048
    description: Human-readable description of what the market resolves on.
  status:
    $ref: "#/components/schemas/MarketStatus"
  tick_size:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Minimum price increment, in dollars.
    example: "0.55"
  minimum_price:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Minimum allowed order price, in dollars.
    example: "0.55"
  maximum_price:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Maximum allowed order price, in dollars.
    example: "0.55"
  expires_at:
    type: string
    format: date-time
    maxLength: 40
    x-udx-timestamp-context: prospective
    description: The configured expiration instant.
    example: 2026-06-21T00:00:00.000000Z
  external_ids:
    $ref: "#/components/schemas/MarketExternalIds"
  series_ticker:
    type: string
    maxLength: 128
    description: The series the market is listed under.
    example: UDXNFLGAMEWIN
  event_ticker:
    type: string
    maxLength: 128
    description: Groups markets on the same game or contest within a series.
    example: UDXNFLGAMEWIN_DETCAR26OCT04
  title:
    type: string
    maxLength: 512
    description: Short display name for the market.
  rules:
    type: string
    maxLength: 65536
    description: The rules that decide how the market resolves.
  strike:
    $ref: "#/components/schemas/MarketStrike"
  opens_at:
    type: string
    format: date-time
    maxLength: 40
    x-udx-timestamp-context: prospective
    description: The configured instant the market opens for trading.
    example: 2026-06-20T17:00:00.000000Z
  notional_value:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: What one YES contract pays if the market resolves YES, in dollars.
    example: "0.55"
  contract_terms_url:
    type: string
    format: uri
    maxLength: 2048
    description: Link to the contract terms the market is listed under.
```

##### `#/components/schemas/MarketLeg`

```yaml
type: object
additionalProperties: false
description: A component market and the outcome selected by a multi-leg market.
required:
  - ticker
  - outcome
properties:
  ticker:
    $ref: "#/components/schemas/Ticker"
  outcome:
    type: string
    description: The outcome of this component market selected by the multi-leg market.
    enum:
      - yes
      - no
  external_ids:
    $ref: "#/components/schemas/MarketExternalIds"
```

##### `#/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/MarketExternalIds`

```yaml
type: object
additionalProperties: false
description: Identifiers this market carries in third-party data providers' systems.
properties:
  optic_odds:
    $ref: "#/components/schemas/MarketExternalIdsOpticOdds"
```

##### `#/components/schemas/MarketExternalIdsOpticOdds`

```yaml
type: object
additionalProperties: false
description: Identifiers in OpticOdds.
properties:
  fixture_id:
    type: string
    minLength: 1
    maxLength: 128
    description: The OpticOdds fixture this market is priced from.
    example: 20260927A1B2C3
  market_id:
    type: string
    minLength: 1
    maxLength: 128
    description: The OpticOdds market this market is a selection of.
    example: player_points
  team_id:
    type: string
    minLength: 1
    maxLength: 128
    description: The OpticOdds team this market is about, when the market is about a team.
    example: 1A2B3C4D5E6F
  player_id:
    type: string
    minLength: 1
    maxLength: 128
    description: The OpticOdds player this market is about, when the market is about a player.
    example: 7G8H9I0J1K2L
```

##### `#/components/schemas/MarketStatus`

```yaml
type: string
enum:
  - unopened
  - open
  - paused
  - closed
  - expired
description: Market trading status.
```

##### `#/components/schemas/MarketStrike`

```yaml
type: object
additionalProperties: false
description: The threshold the market's outcome is compared with.
required:
  - value
properties:
  type:
    $ref: "#/components/schemas/MarketStrikeType"
  value:
    type: string
    maxLength: 255
    description: The strike itself, such as a line or a team name.
    example: "1.5"
  unit:
    $ref: "#/components/schemas/MarketStrikeUnit"
```

##### `#/components/schemas/MarketStrikeType`

```yaml
type: string
enum:
  - greater
  - greater_or_equal
  - less
  - less_or_equal
  - equal
description: How the outcome is compared with the strike value.
```

##### `#/components/schemas/MarketStrikeUnit`

```yaml
type: string
enum:
  - decimal
  - integer
  - points
  - string
  - bool
  - unknown
description: How to read the strike value.
```

##### `#/components/schemas/MarketOpenedEnvelope`

```yaml
type: object
additionalProperties: false
description: Trading became available, including a reopening after closed or paused.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_opened
    description: Identifies a market that opened for trading.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```

##### `#/components/schemas/MarketPausedEnvelope`

```yaml
type: object
additionalProperties: false
description: Trading was temporarily interrupted; the market can return to opened.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_paused
    description: Identifies a market whose trading paused.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```

##### `#/components/schemas/MarketClosedEnvelope`

```yaml
type: object
additionalProperties: false
description: An active trading interval ended.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_closed
    description: Identifies a market whose trading interval ended.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```

##### `#/components/schemas/MarketExpiredEnvelope`

```yaml
type: object
additionalProperties: false
description: Trading is terminal. The market remains in the catalog and may still be awaiting settlement.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_expired
    description: Identifies a market whose trading expired.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```

##### `#/components/schemas/MarketDeletedEnvelope`

```yaml
type: object
additionalProperties: false
description: The market left the catalog. Positions and settlement records may still reference its ticker.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_deleted
    description: Identifies a market removed from the catalog.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```

##### `#/components/schemas/MarketMetadataUpdatedEnvelope`

```yaml
type: object
additionalProperties: false
description: The market's metadata changed.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: market_metadata_updated
    description: Identifies a market whose public fields changed.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/MarketLifecyclePayload"
```
