## Activities of a CRM record

`GET /v1/deals/:id/activities`

`GET /v1/leads/:id/activities`

`GET /v1/contacts/:id/activities`

`GET /v1/companies/:id/activities`

Returns the activities of the deal, lead, contact or company selected in the URL. Use it when the owner ID is already known and you need all of its activities page by page.

## Parameters

| Parameter | Type | Required | Default | Description |
|----------|-----|-------|-----------|----------|
| `id` (path) | number | yes | — | ID of the activity owner. The URL sets the owner type: `deals` — deal, `leads` — lead, `contacts` — contact, `companies` — company. IDs come from the [deal](../deals/list.md), [lead](../leads/list.md), [contact](../contacts/list.md) or [company](../companies/list.md) lists |
| `limit` (query) | integer | no | `50` | Page size, from `1` to `200`. A larger value is capped at `200`. Zero, an empty or a non-numeric value is replaced with `50`, a negative one with `1` |
| `offset` (query) | integer | no | `0` | How many records to skip. A negative or non-numeric value is replaced with `0` |

Pagination: while `meta.hasMore` is `true`, increase `offset` by `data.length`. An empty `data` stops the traversal even if `meta.hasMore` is `true`: the offset will not advance, and the same request returns the same result. Do not repeat it; switch to the [main activity list](./list.md) with a narrowing filter. The `OFFSET_BEYOND_FETCHED_PAGE` warning with `field: "offset"` arrives in some of these cases; its absence does not guarantee progress.

## Examples

### curl — personal key

```bash
curl -X GET "https://vibecode.bitrix24.com/v1/deals/575/activities?limit=50&offset=0" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl -X GET "https://vibecode.bitrix24.com/v1/deals/575/activities?limit=50&offset=0" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const response = await fetch('https://vibecode.bitrix24.com/v1/deals/575/activities?limit=50&offset=0', {
  method: 'GET',
  headers: {
    "X-Api-Key": "YOUR_API_KEY"
  },
})
const result = await response.json()
if (!response.ok || !result.success) throw new Error(JSON.stringify(result.error))
console.log(result.data)
```

### JavaScript — OAuth application

```javascript
const response = await fetch('https://vibecode.bitrix24.com/v1/deals/575/activities?limit=50&offset=0', {
  method: 'GET',
  headers: {
    "X-Api-Key": "YOUR_APP_KEY",
    "Authorization": "Bearer USER_SESSION_TOKEN"
  },
})
const result = await response.json()
if (!response.ok || !result.success) throw new Error(JSON.stringify(result.error))
console.log(result.data)
```

## Response fields

| Field | Type | Description |
|------|-----|----------|
| `success` | boolean | `true` on success |
| `data` | array | The owner's activities |
| `data[].id`, `data[].responsibleId`, `data[].ownerTypeId`, `data[].ownerId`, `data[].priority` | number | Activity ID, responsible employee, owner type and ID, priority |
| `data[].direction` | number / string | Activity direction. The value `"0"` arrives as a string |
| `data[].subject`, `data[].description` | string / null | Subject and description |
| `data[].type` | string / null | Activity kind: `email`, `call`, `meeting`, `task`. Other kinds arrive as is. This is not the numeric `TYPE_ID` |
| `data[].completed` | boolean | Whether the activity is completed |
| `data[].deadline`, `data[].startTime`, `data[].endTime`, `data[].createdAt`, `data[].updatedAt` | string | Dates in UTC, ISO 8601. An unset value arrives as an empty string |
| Other activity fields | any | Arrive under their original upper-case names: `TYPE_ID`, `PROVIDER_ID`, `STATUS`, `AUTHOR_ID` and others. Numbers in them are strings |
| `meta.total` | integer | Total number of the owner's activities |
| `meta.hasMore` | boolean | Whether there are records after the current page |
| `meta.warnings` | array | Present only with the `OFFSET_BEYOND_FETCHED_PAGE` warning: objects with the fields `code`, `field`, `message` |

## Response example

The main record fields are shown.

```json
{
  "success": true,
  "data": [
    {
      "id": 8385,
      "ownerId": 8889,
      "ownerTypeId": 2,
      "TYPE_ID": "2",
      "PROVIDER_ID": "VOXIMPLANT_CALL",
      "type": "call",
      "subject": "Call the customer",
      "createdAt": "2026-10-16T08:22:22.000Z",
      "updatedAt": "2026-10-16T08:22:22.000Z",
      "startTime": "",
      "completed": false,
      "STATUS": "1",
      "responsibleId": 1,
      "priority": 1,
      "direction": "0"
    }
  ],
  "meta": {
    "total": 1,
    "hasMore": false
  }
}
```

## Error response example

403 — the key lacks the `crm` scope:

```json
{
  "success": false,
  "error": {
    "code": "SCOPE_DENIED",
    "message": "Requires 'crm' scope"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|----------|
| 400 | `INVALID_PARAMS` | Bitrix24 rejected a parameter |
| 404 | `ENTITY_NOT_FOUND` | Bitrix24 responded with a "not found" code |
| 422 | `BITRIX_ERROR` | Another Bitrix24 refusal; the text is in `error.message` |
| 429 | `RATE_LIMITED` | The list read limit or the Bitrix24 request limit is exceeded |
| 403 | `SCOPE_DENIED` | The key lacks the `crm` scope |
| 401 | `TOKEN_MISSING` | The key has no Bitrix24 tokens configured |

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

## Known specifics

**Filters and sorting are not applied.** The `filter`, `sort`, `order` and `select` parameters are ignored: the response is the same with and without them. To select by fields, use [`GET /v1/activities`](./list.md) with an owner filter: `?filter[ownerTypeId]=2&filter[ownerId]=575` for the same deal. Field names there are camelCase; here some fields arrive in upper case.

**A non-existent owner returns an empty list.** For an `id` that does not exist in the Bitrix24 account, the response is `200` with an empty `data` and `meta.total` equal to `0`, not an error.

**Only the owner's activities are listed.** Activities linked to the record only through an additional [binding](./bindings/list.md) are not included.

## See also

- [Create an activity for a CRM record](./owner-create.md)
- [List activities](./list.md)
- [Activity fields](./fields.md)
