> For the complete documentation index, see [llms.txt](https://tweet-catcher.gitbook.io/tweet-catcher/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tweet-catcher.gitbook.io/tweet-catcher/tweet-catcher-guide/tweet-catcher-monitor/pro-plan/websocket.md).

# WebSocket

### Authentication

To connect to Tweet Catcher servers you must submit a valid user token, you can get your token on the [dashboard](https://monitor.tweet-catcher.com/), by creating a task and selecting "WebSocket" as option

<figure><img src="/files/IXLSxSzCYt06P6wRp9sd" alt="" width="502"><figcaption></figcaption></figure>

### Here's a representation of the connection to Tweet Catcher server

```
[Client] 
Establish connection to wss://monitor-api.tweet-catcher.com/websocket

[Tweet Catcher] Hello event
{ op: 10, heartbeat_interval: 45000 }

[Client] Heartbeat event
{ op: 1 }

[Tweet Catcher] Heartbeat ACK event
{ op: 11 }

[Client] Login
{ op: 2, token: "YOUR_TOKEN" }

[Tweet Catcher] Disconnection event(s)
{ op: 3, text: "REASON_OF_DISCONNECTION" }

[Tweet Catcher] Ready event
{ op: 4 }

[Tweet Catcher] Monitor event(s)
{
  op: 0,
  d: EventData
}
```

### Data format of the events

{% content-ref url="/spaces/rbIIJV4wkXAJAFalCfbm/pages/Rk6v4AKDwRMP20qE7BfE" %}
[Events](/tweet-catcher/tweet-catcher-guide/tweet-catcher-monitor/pro-plan/websocket/events.md)
{% endcontent-ref %}

### Simple JavaScript implementation example

```javascript
const WebSocket = require("ws")

const loginToken = "YOUR_TOKEN"

let heartbeatInt = null

const ws = new WebSocket("wss://monitor-api.tweet-catcher.com/websocket")

ws.on('error', console.error)

ws.on('close', async (code) => {
  console.warn("Websocket connection closed with code:", code)
  clearInterval(heartbeatInt)
  /* Your reconnection logic */
})

ws.on('message', (data) => {
  try
  {
    const objData = JSON.parse(data)
//    console.log(objData)
    switch (objData.op)
    {
      case 0: // New Notification
        console.log("New notification", objData.d)
        break

      case 3: // Connection status updates
        console.warn("Server connection closed with message:", objData.text)
        break
      
      case 4: // Ready event
        console.log("Logged in!")
        break

      case 10: // Init heartbeat
        ws.send(JSON.stringify({ op: 2, token: loginToken })) // Login
        heartbeatInt = setInterval(() => {
          try
          { ws.send('{"op":1}') }
          catch (e)
          { console.error("Failed to send hearthbeat", e) }
        }, objData.heartbeat_interval)
        break
    }
  }
  catch (e)
  {
    console.error("Error on ws on message:", e)
  }
})
```
