# Data Streams WebSocket
Source: https://docs.chain.link/data-streams/reference/data-streams-api/interface-ws


<DataStreams section="dsNotes" />

## Domains

| Description        | Testnet URL                             | Mainnet URL                     |
| :----------------- | :-------------------------------------- | :------------------------------ |
| WebSocket endpoint | wss\://ws.testnet-dataengine.chain.link | wss\://ws.dataengine.chain.link |

## Authentication

All connections to the Data Streams WebSocket API require authentication. For comprehensive documentation on generating authentication headers and implementing the HMAC authentication process, please refer to the [Data Streams Authentication](/data-streams/reference/data-streams-api/authentication) page.

**Note**: If you're using a [Data Streams SDK](/data-streams/reference/data-streams-api/go-sdk), you don't need to manually generate authentication headers.

### Headers

All routes require the following three headers for user authentication:

| Header                             | Description                                                                                                                                                                      |
| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Authorization`                    | The user’s unique identifier, provided as a UUID (Universally Unique IDentifier).                                                                                                |
| `X-Authorization-Timestamp`        | The current timestamp, with precision up to milliseconds. The timestamp must closely synchronize with the server time, allowing a maximum discrepancy of 5 seconds (by default). |
| `X-Authorization-Signature-SHA256` | The HMAC (Hash-based Message Authentication Code) signature, generated by hashing parts of the request and its metadata using SHA-256 with a shared secret key.                  |

## WebSocket Connection

Establish a streaming WebSocket connection that sends reports for the given stream ID(s) after they are verified.

##### Endpoint

**`/api/v1/ws`**

| Type      | Parameter(s)                                                  |
| --------- | ------------------------------------------------------------- |
| WebSocket | `feedIDs`: A comma-separated list of Data Streams stream IDs. |

##### Sample request

```http
GET /api/v1/ws?feedIDs=<feedID1>,<feedID2>,...
```

##### Sample response

```json
{
  "report": {
    "feedID": "hex encoded feedId",
    "fullReport": "a blob containing the report context + body, can be passed unmodified to the contract for verification"
  }
}
```

## Error response codes

| Status Code           | Description                                                                                                                                                                                                                                                                           |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 400 Bad Request       | This error is triggered when: <ul><li>There is any missing/malformed query argument.</li><li>Required headers are missing or provided with incorrect values.</li></ul>                                                                                                                |
| 401 Unauthorized User | This error is triggered when: <ul><li>Authentication fails, typically because the HMAC signature provided by the client doesn't match the one expected by the server.</li><li>A user requests access to a stream without the appropriate permission or that does not exist.</li></ul> |
| 500 Internal Server   | Indicates an unexpected condition encountered by the server, preventing it from fulfilling the request. This error typically points to issues on the server side.                                                                                                                     |