## Mark the client as spam

`POST /v1/openlines/operator/spam`

Marks the Open Channel client as spam and closes the current session of their chat, finishing the dialog with them.

The action runs on behalf of the employee the key belongs to — see [On whose behalf the action runs](/docs/openlines/operator#on-whose-behalf-the-action-runs).

## Request fields (body)

| Field | Type | Required | Description |
|---|---|:---:|---|
| `chatId` | number \| string | yes | Open Channel chat identifier, a positive integer. A string is accepted if it consists of digits only and does not start with zero. See [Chat ID](/docs/openlines/operator#chat-id) |

## Examples

### curl — personal key

```bash
curl -X POST https://vibecode.bitrix24.com/v1/openlines/operator/spam \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"chatId": 5253}'
```

### curl — OAuth application

```bash
curl -X POST https://vibecode.bitrix24.com/v1/openlines/operator/spam \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"chatId": 5253}'
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/openlines/operator/spam', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ chatId: 5253 }),
})

const body = await res.json()
if (!body.success) throw new Error(`${body.error.code}: ${body.error.message}`)
console.log('Client marked as spam, chat:', body.data.chatId)
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/openlines/operator/spam', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ chatId: 5253 }),
})

const body = await res.json()
if (!body.success) throw new Error(`${body.error.code}: ${body.error.message}`)
console.log('Client marked as spam, chat:', body.data.chatId)
```

## Response fields

| Field | Type | Description |
|---|---|---|
| `success` | boolean | `true` |
| `data.chatId` | number | Chat identifier from the request. A string from the request is returned as a number |
| `data.spammed` | boolean | Always `true` |

## Response example

```json
{
  "success": true,
  "data": {
    "chatId": 5253,
    "spammed": true
  }
}
```

## Error response example

404 — no chat with this identifier:

```json
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "Open Line chat not found"
  }
}
```

## Errors

| HTTP | Code | Description |
|---|---|---|
| 400 | `INVALID_CHAT_ID` | `chatId` is missing, is not a positive integer, is a string with non-digit characters or a leading zero, or is greater than 9007199254740991 |
| 404 | `ENTITY_NOT_FOUND` | No chat with this `chatId` |
| 422 | `BITRIX_ERROR` | Bitrix24 refused the action. The refusal code, if Bitrix24 returned one, is in `error.b24Code` |
| 403 | `BITRIX_ACCESS_DENIED` | The employee the call runs as has no permission for the action |
| 502 | `OPENLINE_OPERATOR_FAILED` | Bitrix24 responded without an error but did not confirm the action |
| 403 | `SCOPE_DENIED` | The key has no `imopenlines` scope |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is read-only |
| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |
| 401 | `INVALID_API_KEY` | The key is not recognized |
| 401 | `TOKEN_MISSING` | A personal key has no access to the Bitrix24 portal, or an application key was sent without a session token in `Authorization` |
| 502 | `BITRIX_UNAVAILABLE` | Bitrix24 is unavailable or the connection to it broke before the response was complete |

Full list of common API errors — [Errors](/docs/errors).

## Known specifics

- **The response does not prove there was an open dialog.** For a chat whose session is already closed, and on a repeated call, the method returns the same response with `spammed: true`, and no new session is created. To check whether the call closed a session, use [`POST /v1/openlines/sessions/search`](/docs/openlines/sessions/search): a session closed by this method has `status` and `closeReason` equal to `spam`.

## See also

- [Operator actions and my pause](/docs/openlines/operator)
- [Finish another operator's dialog](/docs/openlines/operator/finish-another)
- [Session search](/docs/openlines/sessions/search)
- [Open Channels](/docs/openlines)
