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

# Corporate Disclosures

> Live updates over WebSocket as new corporate disclosures are published.

```
wss://api.ngnmarket.com/v1/ws/disclosures
```

This pushes newly-published corporate disclosures as they're recorded, with the same fields and cleaned title text [`GET /disclosures`](/api-reference/disclosures/list) returns. No query parameters.

```
wss://api.ngnmarket.com/v1/ws/disclosures?api_key=ngm_live_YOUR_KEY
```

<Note>
  This channel works differently from [Prices](/websocket/prices), [Market Snapshot](/websocket/snapshot), [Indices](/websocket/indices), and [Forex Rates](/websocket/forex). Disclosures are an append-only log, not a value that changes in place, so there's no current state to repeat on every update. See [Message format](#message-format) below.
</Note>

<CodeGroup>
  ```javascript Browser theme={null}
  const ws = new WebSocket(
    'wss://api.ngnmarket.com/v1/ws/disclosures?api_key=ngm_live_YOUR_KEY'
  );

  ws.onmessage = (event) => {
    const msg = JSON.parse(event.data);
    console.log(msg.type, msg.disclosures);
  };
  ```

  ```javascript Node.js theme={null}
  import WebSocket from 'ws';

  const ws = new WebSocket(
    'wss://api.ngnmarket.com/v1/ws/disclosures?api_key=ngm_live_YOUR_KEY'
  );

  ws.on('message', (data) => {
    const msg = JSON.parse(data.toString());
    console.log(msg.type, msg.disclosures);
  });
  ```

  ```python Python theme={null}
  import asyncio
  import json
  import websockets

  async def main():
      url = "wss://api.ngnmarket.com/v1/ws/disclosures?api_key=ngm_live_YOUR_KEY"
      async with websockets.connect(url) as ws:
          async for raw in ws:
              msg = json.loads(raw)
              print(msg["type"], msg["disclosures"])

  asyncio.run(main())
  ```
</CodeGroup>

## Message format

`snapshot` arrives once on connect with the 20 most recent disclosures, so you have context right away. Every `update` after that contains only the disclosures published since your last message: never the full history again, and never one you've already received.

```json theme={null}
{
  "type": "update",
  "disclosures": [
    {
      "id": 2251,
      "title": "Unaudited Q2 2026 results",
      "company_name": "Dangote Cement Plc",
      "company_symbol": "DANGCEM",
      "isin": "NGDANGCEM001",
      "submission_type": "Financial Statement",
      "document_url": "https://doclib.ngxgroup.com/Financial_NewsDocs/...",
      "disclosed_at": "2026-08-21T09:15:00.000Z",
      "modified_at": "2026-08-21T09:15:00.000Z"
    }
  ]
}
```

<Note>
  `title` has any leading company-name prefix stripped and is sentence-cased. It's the same cleanup [`GET /disclosures`](/api-reference/disclosures/list) applies, so titles look the same whether you pull them from REST or from this channel. `isin` comes back as an empty string, not `null`, when NGX hasn't recorded one for that filing.
</Note>

An `update` can contain more than one disclosure if several were published within the same five-second check interval. If nothing new was published, no `update` message goes out at all.

See [Errors](/websocket/errors) for connection-level error codes. This channel takes no parameters, so nothing about it specifically can fail.
