> ## Documentation Index
> Fetch the complete documentation index at: https://docs.snek.fun/llms.txt
> Use this file to discover all available pages before exploring further.

# Charts WebSocket

> Protocol v2 — LastBar and MCapBar streams

Real-time **price bars** and **market-cap bars** use the same **WebSocket Protocol v2** as other Snekfun services: JSON text frames, subscribe / unsubscribe envelopes, and `DefaultOutgoingMessage` responses.

**Auth:** Public

## Connection

* **Public URL (typical):** `wss://charts.snek.fun/v1/websocket/ws` (reverse proxy adds `/websocket` before `/ws`).
* **Application route:** the server binds WebSocket at path `/ws` on the charts WS port.

Open the socket, then send **Connect** (optional depending on client) and **Subscribe** messages as JSON.

## Topics

| Topic     | Purpose                                          |
| --------- | ------------------------------------------------ |
| `LastBar` | OHLCV updates for a `pair` + `interval`          |
| `MCapBar` | Market-cap bar updates for a `pair` + `interval` |

## Subscribe (client → server)

```json theme={null}
{
  "messageType": "subscribe",
  "clientId": "my-client-1",
  "requestId": "req-001",
  "topic": "LastBar",
  "data": {
    "pair": {
      "base": "279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f.534e454b",
      "quote": "."
    },
    "interval": "min1"
  }
}
```

* `pair.base` / `pair.quote`: Cardano asset ids; ADA may be `"."`, `"ADA"`, or `"0x"` on input.
* `interval`: `min1` | `min5` | `hour1` | `day1` | `week1` | `month1`.

For **MCapBar**, set `"topic": "MCapBar"` with the same `data` shape.

## Unsubscribe

```json theme={null}
{
  "messageType": "unsubscribe",
  "clientId": "my-client-1",
  "requestId": "req-001"
}
```

## Server → client

Envelope:

```json theme={null}
{
  "requestId": "req-001",
  "event": "LastBarUpdate",
  "messageType": "Response",
  "data": {
    "pair": "baseAsset_quoteAsset",
    "time": 1729459260,
    "low": "0.0998",
    "high": "0.1015",
    "open": "0.1001",
    "close": "0.1009",
    "volume": "345.67",
    "isRelevant": true
  }
}
```

`MCapBarUpdate` events carry `mCap` instead of OHLCV fields.

## HTTP fallback

Use [Charts HTTP](/api-reference/charts-ws/http) for historical ranges and initial snapshots if WebSocket is unavailable.


## AsyncAPI

````yaml api-reference/asyncapi.json charts
id: charts
title: Charts (Protocol v2)
description: Topics LastBar and MCapBar with pair + interval in data.
servers:
  - id: charts
    protocol: wss
    host: charts.snek.fun
    bindings: []
    variables: []
address: /v1/websocket/ws
parameters: []
bindings: []
operations:
  - &ref_3
    id: sendCharts
    title: Send charts
    type: send
    messages:
      - &ref_5
        id: Subscribe
        payload:
          - name: Subscribe
            description: Charts subscribe
            type: object
            properties:
              - name: messageType
                type: string
                description: subscribe
                required: true
              - name: clientId
                type: string
                required: true
              - name: requestId
                type: string
                required: true
              - name: topic
                type: string
                enumValues:
                  - LastBar
                  - MCapBar
                required: true
              - name: data
                type: object
                required: true
                properties:
                  - name: pair
                    type: object
                    required: true
                    properties:
                      - name: base
                        type: string
                        required: true
                      - name: quote
                        type: string
                        required: true
                  - name: interval
                    type: string
                    enumValues:
                      - min1
                      - min5
                      - hour1
                      - day1
                      - week1
                      - month1
                    required: true
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - messageType
            - clientId
            - requestId
            - topic
            - data
          properties:
            messageType:
              type: string
              const: subscribe
              x-parser-schema-id: <anonymous-schema-22>
            clientId:
              type: string
              x-parser-schema-id: <anonymous-schema-23>
            requestId:
              type: string
              x-parser-schema-id: <anonymous-schema-24>
            topic:
              type: string
              enum:
                - LastBar
                - MCapBar
              x-parser-schema-id: <anonymous-schema-25>
            data:
              type: object
              required:
                - pair
                - interval
              properties:
                pair:
                  type: object
                  required:
                    - base
                    - quote
                  properties:
                    base:
                      type: string
                      x-parser-schema-id: <anonymous-schema-28>
                    quote:
                      type: string
                      x-parser-schema-id: <anonymous-schema-29>
                  x-parser-schema-id: <anonymous-schema-27>
                interval:
                  type: string
                  enum:
                    - min1
                    - min5
                    - hour1
                    - day1
                    - week1
                    - month1
                  x-parser-schema-id: <anonymous-schema-30>
              x-parser-schema-id: <anonymous-schema-26>
          x-parser-schema-id: SubscribeChartsPayloadV2
        title: Subscribe
        description: Charts subscribe
        example: |-
          {
            "messageType": "subscribe",
            "clientId": "c1",
            "requestId": "r1",
            "topic": "LastBar",
            "data": {
              "pair": {
                "base": "policy.hex",
                "quote": "."
              },
              "interval": "min1"
            }
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: Subscribe
      - &ref_6
        id: Unsubscribe
        payload:
          - name: Unsubscribe
            type: object
            properties:
              - name: messageType
                type: string
                description: unsubscribe
                required: true
              - name: clientId
                type: string
                required: true
              - name: requestId
                type: string
                required: true
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - messageType
            - clientId
            - requestId
          properties:
            messageType:
              type: string
              const: unsubscribe
              x-parser-schema-id: <anonymous-schema-6>
            clientId:
              type: string
              x-parser-schema-id: <anonymous-schema-7>
            requestId:
              type: string
              x-parser-schema-id: <anonymous-schema-8>
          x-parser-schema-id: UnsubscribePayloadV2
        title: Unsubscribe
        example: |-
          {
            "messageType": "unsubscribe",
            "clientId": "c1",
            "requestId": "r1"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: Unsubscribe
    bindings: []
    extensions: &ref_1
      - id: x-parser-unique-object-id
        value: charts
  - &ref_2
    id: receiveCharts
    title: Receive charts
    type: receive
    messages:
      - &ref_4
        id: Outgoing
        payload:
          - name: Charts bar update
            type: object
            properties:
              - name: requestId
                type: &ref_0
                  - string
                  - 'null'
                required: false
              - name: event
                type: string
                enumValues:
                  - LastBarUpdate
                  - MCapBarUpdate
                required: false
              - name: messageType
                type: string
                required: false
              - name: data
                type: object
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            requestId:
              type: *ref_0
              x-parser-schema-id: <anonymous-schema-31>
            event:
              type: string
              enum:
                - LastBarUpdate
                - MCapBarUpdate
              x-parser-schema-id: <anonymous-schema-32>
            messageType:
              type: string
              x-parser-schema-id: <anonymous-schema-33>
            data:
              type: object
              x-parser-schema-id: <anonymous-schema-34>
          x-parser-schema-id: ChartsOutgoingMessage
        title: Charts bar update
        example: No examples found
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: Outgoing
    bindings: []
    extensions: *ref_1
sendOperations:
  - *ref_2
receiveOperations:
  - *ref_3
sendMessages:
  - *ref_4
receiveMessages:
  - *ref_5
  - *ref_6
extensions:
  - id: x-parser-unique-object-id
    value: charts
securitySchemes: []

````