# Calls meeting follow-ups

Read meeting follow-ups from Calls with the `syncconnector` scope. These read-only methods use Bitrix24 REST 3.0 and require `syncconnector` 26.100.0 and `rest` 26.1300.0 or later. The scope is available without a feature flag. Method availability depends on the Bitrix24 account update.

Cowork keys and automatically assembled scope sets do not include `syncconnector`. To read Calls follow-ups, explicitly select this scope for a personal key or an application.

**Base URL:** `https://vibecode.bitrix24.com/v1` | **Scope:** `syncconnector`

## Operations

| Method | Route | Bitrix24 method |
|---|---|---|
| POST | `/v1/calls/sync-followups/list` | `syncconnector.followup.list` |
| GET | `/v1/calls/sync-followups/:followupId` | `syncconnector.followup.get` |

## Access and identifiers

The response contains only meetings of the webhook owner or the user whose OAuth token is forwarded. This restriction applies to administrators too. `filter.participantId` cannot expand access: the platform refuses it with `400 INVALID_PARAMS` because Calls only returns the key owner meetings. Optional `filter.chatId` narrows this set.

`followupId` is the number of a follow-up page: take it from the list item `callId`. It is not a call number and cannot be matched to classic follow-up ids from [Call follow-up](/docs/calls/followup).

An application using a personal key shows the key owner meetings to **all** its users. A multiuser application needs an OAuth application key and the current user session. This determines which user meetings each request reads.

## List parameters

Send a JSON body to `POST /v1/calls/sync-followups/list`.

| Parameter | Type | Required | Meaning |
|---|---|---|---|
| `filter` | object | Yes | Meeting filter |
| `filter.startDate` | object | Yes | Closed date range |
| `filter.startDate.from` | ISO 8601 string | Yes | Start, including timezone |
| `filter.startDate.to` | ISO 8601 string | Yes | End, including timezone; no earlier than `from` |
| `filter.chatId` | positive integer | No | Restrict to a chat |
| `select` | string array | No | Supported fields below; omitted or `[]` selects base fields |
| `order.startDate` | `asc` or `desc` | No | The only supported order field |
| `mentionFormat` | `bb`, `html` or `none` | No | Mention formatting |
| `pagination.limit` | integer | No | With any AI block or dotted AI field: default 20, max 20; otherwise default 50, max 200; minimum 1 |
| `pagination.afterCursor` | object | No | Previous response cursor, unchanged |

`page`, `offset`, `start`, unsupported fields, invalid dates and unsupported selection/order/format values return `400 INVALID_PARAMS` before Bitrix24 is called. Request bodies and nested parameter objects accept only the fields listed above.

### Example requests

Illustrative requests, using your own key and date window:

```bash
curl -X POST 'https://vibecode.bitrix24.com/v1/calls/sync-followups/list' \
  -H "X-Api-Key: $VIBE_API_KEY" -H 'Content-Type: application/json' \
  -d '{"filter":{"startDate":{"from":"2026-11-01T00:00:00Z","to":"2026-11-10T23:59:59Z"}},"select":["callId","chatId","overview"],"pagination":{"limit":20}}'
```

For an OAuth application key, add `Authorization: Bearer <current-user-session-token>` alongside `X-Api-Key: <application-key>`. Do not substitute a shared personal key.

```javascript
const response = await fetch(`${baseUrl}/v1/calls/sync-followups/list`, {
  method: 'POST',
  headers: { 'X-Api-Key': apiKey, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    filter: { startDate: { from: '2026-11-01T00:00:00Z', to: '2026-11-10T23:59:59Z' } },
    select: ['callId', 'chatId', 'overview'], pagination: { limit: 20 },
  }),
});
const page = (await response.json()).data;
```

## Get parameters

`GET /v1/calls/sync-followups/:followupId` accepts a positive integer page number. Internally the same number is sent as `callId`.

| Query parameter | Type | Meaning |
|---|---|---|
| `select` | repeated or comma-separated field names | Omit for the full form. `?select=` or `?select=[]` explicitly selects base fields. These are different requests |
| `mentionFormat` | `bb`, `html` or `none` | Mention formatting |

Example: `GET /v1/calls/sync-followups/17?select=overview.actionItems&mentionFormat=none`. Obtain `17` from your own list response.

## Supported selection

Blocks and the listed dotted subfields are supported. Any unknown field returns `400 INVALID_PARAMS`.

| Field or block | Supported dotted subfields |
|---|---|
| `callId`, `callType`, `initiatorId`, `startDate`, `endDate`, `durationSeconds`, `uuid`, `chatId`, `participants`, `tracks`, `outcomes`, `language`, `version`, `createdAt` | Metadata |
| `transcription` | `transcription.language`, `transcription.segments` |
| `overview` | `overview.topic`, `overview.detailedTakeaways`, `overview.meetingType`, `overview.agenda`, `overview.agreements`, `overview.actionItems`, `overview.meetings` |
| `summary` | Entire block |
| `insights` | `insights.speakerEvaluationAvailable`, `insights.speakerAnalysis`, `insights.meetingStrengths`, `insights.meetingWeaknesses`, `insights.speechStyleInfluence`, `insights.engagementLevel`, `insights.areasOfResponsibility`, `insights.finalRecommendations` |
| `evaluation` | `evaluation.efficiencyValue`, `evaluation.calendar`, `evaluation.criteria` |

Selecting **any** of `transcription`, `overview`, `summary`, `insights`, `evaluation` or their supported dotted subfields reduces the list page limit to 20.

## Response fields and pagination

The list response is `{ success: true, data: { items, hasMore, afterCursor } }`; get returns `{ success: true, data: { item } }`. Items contain metadata and the selected blocks listed above, as supplied by Bitrix24.

| Field | Meaning |
|---|---|
| `data.items` | Array of follow-up pages; it can be empty while `hasMore` is true |
| `data.hasMore` | Whether to continue paging |
| `data.afterCursor` | Opaque cursor: pass it unchanged in the next request `pagination.afterCursor` |
| `data.item` | One follow-up page on get |
| `item.callId` | Follow-up page number to use as `followupId` |
| AI blocks | May be `null` while analysis is not ready; they can be filled later. Read again when needed |
| `tracks` | Track links do not guarantee that a recording can be downloaded |

Stop only when `hasMore` is false. An empty `items` page with `hasMore: true` is not the end; continue with its `afterCursor`. Do not derive an offset or reinterpret the cursor.

## Errors

| HTTP | Code | Condition |
|---|---|---|
| 400 | `INVALID_PARAMS` | Invalid or unsupported parameters, including `participantId`, `page`, `offset`, `start`, or an AI limit over 20 |
| 401 | `UNAUTHORIZED` | Invalid or missing API key |
| 403 | `SCOPE_DENIED` | The key has no `syncconnector` scope |
| 403 | `BITRIX_ACCESS_DENIED` | Bitrix24 refused access, including a webhook without the scope |
| 422 | `METHOD_NOT_YET_AVAILABLE` | Required account update/module is unavailable; `error.release` names `syncconnector 26.100.0; rest >= 26.1300.0` |
| 422 | `BITRIX_ERROR` | Other Bitrix24 refusal |

See [Errors](/docs/errors) for common authentication, credential and account refusals. Choosing `syncconnector` explicitly on a personal key fails if the account does not support that scope; it is never silently removed from a human selection.

## See also

- [Calls](/docs/calls)
- [Call follow-up](/docs/calls/followup)
- [Errors](/docs/errors)
