For AI agents: markdown of this page — /docs-content-en/calls/followup/get.md documentation index — /llms.txt
Follow-up for a single call
⚠️ The method ships in the
call 26.600.0update and is not yet available on all Bitrix24 accounts. If the update has not reached your Bitrix24 account yet, the API returns422 METHOD_NOT_YET_AVAILABLE— this means the method has not been released on the account yet, not an integration error.
GET /v1/calls/followups/:callId
Returns the AI Follow-up of a single finished call.
Parameters
| Parameter | Type | Req. | Description |
|---|---|---|---|
callId (path) |
integer | yes | Call identifier. A positive integer. Where to get it — POST /v1/calls/followups/list |
select (query) |
string[] | no | Which fields to return. Pass it as a repeated parameter or as a comma-separated list. The set of values is the same as in the list method — see the "Select field" section of Follow-up list |
mentionFormat (query) |
string | no | Format of @-mentions in text fields: bb, html or none. Default — bb |
Select field
select value |
What comes back |
|---|---|
| Not passed | The full Follow-up object. All fields are present, missing data arrives as null |
| Empty array | Base metadata only: callId, callType, initiatorId, startDate, endDate, durationSeconds |
| List of fields | Only the listed fields and always callId. A requested but unfilled field arrives as null |
Examples
A request without select returns the whole Follow-up. mentionFormat: none strips the mention markup, so the text is ready to pass to an AI model or to store in a task. To fetch only some of the blocks, add select — for example ?select=overview.actionItems&select=evaluation.efficiencyValue.
curl — personal key
curl "https://vibecode.bitrix24.com/v1/calls/followups/12345?mentionFormat=none" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/calls/followups/12345?mentionFormat=none" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const params = new URLSearchParams({ mentionFormat: 'none' })
const res = await fetch(`https://vibecode.bitrix24.com/v1/calls/followups/12345?${params}`, {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const body = await res.json()
if (!body.success) {
// Handle the error explicitly: otherwise on 403 or 422 the code breaks when reading data
throw new Error(`${body.error.code}: ${body.error.message}`)
}
const { data } = body
const call = data.item
// Ready AI blocks are listed in outcomes, the ones that are not ready arrive as null
console.log(call.outcomes, `${call.durationSeconds} sec`)
console.log(call.overview?.topic ?? 'overview is not built yet')
for (const item of call.overview?.actionItems ?? []) {
console.log('action item:', item.actionItem, '— quote:', item.quote)
}
// speakerAnalysis is absent if speaker analysis is unavailable on the account
for (const speaker of call.insights?.speakerAnalysis ?? []) {
console.log(`speaker ${speaker.userId}: ${speaker.talkPercentage}% of the time, score ${speaker.efficiencyValue}`)
}
// Criteria are a map, the keys depend on the meeting type: iterate over the keys
for (const [code, criterion] of Object.entries(call.evaluation?.criteria ?? {})) {
console.log(code, criterion.value ? 'met' : 'not met', '—', criterion.thoughts)
}
JavaScript — OAuth application
const params = new URLSearchParams({ mentionFormat: 'none' })
const res = await fetch(`https://vibecode.bitrix24.com/v1/calls/followups/12345?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const body = await res.json()
if (!body.success) {
// Handle the error explicitly: otherwise on 403 or 422 the code breaks when reading data
throw new Error(`${body.error.code}: ${body.error.message}`)
}
const { data } = body
console.log(data.item)
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data.item |
object | Call Follow-up. Its fields are in the table below |
Fields of the item object:
| Field | Type | Description |
|---|---|---|
item.callId |
number | Call identifier |
item.callType |
number | Call type: 1 — instant, 2 — conference, 3 — large room |
item.initiatorId |
number | Call initiator. Employee card — GET /v1/users/:id |
item.startDate |
string | Call start, ISO 8601 in UTC |
item.endDate |
string | null | Call end, ISO 8601 in UTC |
item.durationSeconds |
number | Call duration in seconds |
item.uuid |
string | Call session identifier |
item.language |
string | Transcription language code |
item.version |
number | AI data schema version |
item.participants |
object[] | Call participants |
item.outcomes |
string[] | Ready AI blocks of this call |
item.createdAt |
string | Time of the last AI record |
item.tracks |
object[] | Call recordings |
item.transcription |
object | null | Conversation transcript |
item.overview |
object | null | Meeting overview |
item.summary |
object | null | Summary by segments |
item.evaluation |
object | null | Meeting efficiency evaluation |
item.insights |
object | null | Analytical conclusions and speaker analysis |
Participants — `participants[]`
| Field | Type | Description |
|---|---|---|
userId |
number | Employee identifier |
name |
string | Employee name |
avatar |
string | Avatar link |
workPosition |
string | Job position |
talkedSeconds |
number | How many seconds the participant spoke |
Call recordings — `tracks[]`
| Field | Type | Description |
|---|---|---|
trackId |
number | Recording identifier |
type |
string | Track type, for example mixed_audio |
duration |
number | Recording duration in seconds |
fileName |
string | File name |
mimeType |
string | File MIME type |
url |
string | Download link |
dateCreate |
string | When the recording was created, ISO 8601 |
Transcription — `transcription`
| Field | Type | Description |
|---|---|---|
language |
string | Transcript language code |
segments[] |
object[] | Utterances in chronological order |
segments[].userId |
number | Who speaks |
segments[].userName |
string | Speaker name |
segments[].start |
number | Utterance start, seconds from the call start |
segments[].end |
number | Utterance end, seconds from the call start |
segments[].text |
string | Utterance text |
Meeting overview — `overview`
| Field | Type | Description |
|---|---|---|
topic |
string | Meeting topic |
detailedTakeaways |
string | Detailed takeaways |
meetingType |
object | Meeting type: typeTag — code, title — name, explanation — rationale |
agenda |
object | Agenda: explanation — wording, quote — quote from the conversation |
agreements[] |
object[] | Agreements: agreement — wording, quote — quote |
actionItems[] |
object[] | Action items: actionItem — wording, quote — quote |
meetings[] |
object[] | Scheduled meetings: meeting — wording, quote — quote |
Summary — `summary`
| Field | Type | Description |
|---|---|---|
segments[] |
object[] | Conversation segments |
segments[].start |
number | Segment start, seconds |
segments[].end |
number | Segment end, seconds |
segments[].title |
string | Segment title |
segments[].summary |
string | Segment summary |
Insights — `insights`
| Field | Type | Description |
|---|---|---|
speakerEvaluationAvailable |
boolean | Whether speaker analysis is available on the Bitrix24 account |
speakerAnalysis[] |
object[] | Speaker analysis, in descending order of talkPercentage |
speakerAnalysis[].userId |
number | Employee identifier. Card — GET /v1/users/:id |
speakerAnalysis[].detailedInsight |
string | Conclusion about the participant |
speakerAnalysis[].efficiencyValue |
number | Participant efficiency score, from 0 to 100 |
speakerAnalysis[].evaluationCriteria |
string | The criterion the score is based on |
speakerAnalysis[].talkPercentage |
number | Share of time the participant spoke, in percent |
speakerAnalysis[].duration |
number | How many seconds the participant spoke |
speakerAnalysis[].durationFormat |
string | The same time as MM:SS |
meetingStrengths[] |
object[] | Strengths: strengthTitle and strengthExplanation |
meetingWeaknesses[] |
object[] | Weaknesses: weaknessTitle and weaknessExplanation |
speechStyleInfluence |
string | How the speech style affected the meeting |
engagementLevel |
string | Participant engagement |
areasOfResponsibility |
string | Who is responsible for what as a result |
finalRecommendations |
string | Recommendations for the next meeting |
Efficiency score — `evaluation`
| Field | Type | Description |
|---|---|---|
efficiencyValue |
number | Overall meeting efficiency, from 0 to 100 |
calendar.overhead |
boolean | Whether the meeting took more time than needed |
criteria |
object | Map of criteria. The key is the criterion code, the value is an object with the fields below |
criteria.<code>.value |
boolean | Whether the criterion is met |
criteria.<code>.title |
string | Criterion name |
criteria.<code>.criteria |
string | Criterion wording |
criteria.<code>.thoughts |
string | Rationale for the score |
Response example
{
"success": true,
"data": {
"item": {
"callId": 12345,
"callType": 1,
"initiatorId": 7,
"startDate": "2026-01-15T10:00:00+00:00",
"endDate": "2026-01-15T10:42:00+00:00",
"durationSeconds": 2520,
"uuid": "bb085e5d-5160-4a63-9ac4-152248046c39",
"language": "en",
"version": 3,
"participants": [
{ "userId": 7, "name": "John Smith", "workPosition": "Project manager", "talkedSeconds": 600 }
],
"outcomes": ["transcription", "overview", "summary", "insights", "evaluation"],
"createdAt": "2026-01-15T11:05:00+00:00",
"tracks": [
{ "trackId": 100, "type": "mixed_audio", "duration": 2520, "fileName": "call_12345.wav", "mimeType": "audio/wav", "url": "https://example.bitrix24.com/disk/call_12345.wav", "dateCreate": "2026-01-15T11:00:00+00:00" }
],
"transcription": {
"language": "en",
"segments": [
{ "userId": 7, "userName": "John Smith", "start": 12, "end": 25, "text": "Let's fix the sprint scope. What do we take into work?" },
{ "userId": 42, "userName": "Mary Jones", "start": 26, "end": 48, "text": "I suggest we keep only the catalog import, we won't have time for the rest." },
{ "userId": 7, "userName": "John Smith", "start": 49, "end": 70, "text": "Agreed. Then we show the prototype on Friday." }
]
},
"overview": {
"topic": "Sprint planning",
"detailedTakeaways": "The team reduced the sprint scope to the catalog import and agreed to show the prototype on Friday.",
"meetingType": {
"typeTag": "planning",
"title": "Planning",
"explanation": "The participants distributed tasks and deadlines for the next iteration."
},
"agenda": {
"explanation": "Define the sprint scope and the demo deadline.",
"quote": "Let's fix the sprint scope."
},
"agreements": [
{ "agreement": "Only the catalog import goes into the sprint", "quote": "I suggest we keep only the catalog import, we won't have time for the rest." }
],
"actionItems": [
{ "actionItem": "Prepare the prototype by Friday", "quote": "Then we show the prototype on Friday." }
],
"meetings": [
{ "meeting": "Prototype demo on Friday", "quote": "Then we show the prototype on Friday." }
]
},
"summary": {
"segments": [
{ "start": 0, "end": 600, "title": "Sprint scope", "summary": "Discussed what the team can deliver and reduced the task set to the catalog import." },
{ "start": 601, "end": 2520, "title": "Deadlines and demo", "summary": "Agreed to show the prototype on Friday and to return to the other tasks in the next sprint." }
]
},
"insights": {
"speakerEvaluationAvailable": true,
"speakerAnalysis": [
{
"userId": 42,
"detailedInsight": "The participant proposed reducing the scope and backed it with a deadline estimate.",
"efficiencyValue": 82,
"evaluationCriteria": "Constructiveness of proposals",
"talkPercentage": 66,
"duration": 1200,
"durationFormat": "20:00"
},
{
"userId": 7,
"detailedInsight": "The participant ran the meeting and recorded the agreements.",
"efficiencyValue": 74,
"evaluationCriteria": "Discussion management",
"talkPercentage": 34,
"duration": 600,
"durationFormat": "10:00"
}
],
"meetingStrengths": [
{ "strengthTitle": "Clear outcome", "strengthExplanation": "The meeting ended with a recorded decision and a deadline." }
],
"meetingWeaknesses": [
{ "weaknessTitle": "Unequal participation", "weaknessExplanation": "One participant spoke for two thirds of the time." }
],
"speechStyleInfluence": "The calm pace of speech helped reach a decision quickly.",
"engagementLevel": "High engagement of both participants.",
"areasOfResponsibility": "The catalog import is assigned to Mary Jones.",
"finalRecommendations": "Send the agenda in advance to shorten the scope discussion."
},
"evaluation": {
"efficiencyValue": 75,
"calendar": { "overhead": false },
"criteria": {
"agenda_defined": {
"value": true,
"criteria": "The agenda is stated at the start of the meeting",
"title": "Agenda",
"thoughts": "The host stated the goal in the first utterance."
},
"decisions_made": {
"value": true,
"criteria": "Decisions are made on the questions discussed",
"title": "Decisions",
"thoughts": "The sprint scope and the demo deadline are recorded."
},
"all_participants_involved": {
"value": false,
"criteria": "All participants are involved in the discussion",
"title": "Engagement",
"thoughts": "The split of utterances is 66 to 34 percent."
}
}
}
}
}
}
The keys in evaluation.criteria are criterion codes. Their set depends on the meeting type, so iterate over the map by keys instead of a fixed list.
Error response example
422 — the call is not found or its Follow-up is unavailable:
{
"success": false,
"error": {
"code": "BITRIX_ERROR",
"message": "No access to the Follow-up data"
}
}
The error.message text comes from Bitrix24, so its wording and language depend on the Bitrix24 account language. Branch on error.code, not on the message text.
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_PARAMS |
callId in the path is not a positive integer. Checked before the request to Bitrix24 |
| 400 | INVALID_PARAMS |
A query parameter value is outside the allowed list — for example mentionFormat. If Bitrix24 rejected the value on a specific field, the response also contains an error.validation array with the field name |
| 401 | MISSING_API_KEY |
The X-Api-Key header is missing |
| 401 | TOKEN_MISSING |
The key has no portal tokens. An OAuth application key requires the Authorization: Bearer header |
| 403 | SCOPE_DENIED |
The key has no call scope |
| 403 | BITRIX_ACCESS_DENIED |
Bitrix24 denied access: the key's webhook has no call permission on the portal side. Reconnect the key with the required permission |
| 422 | METHOD_NOT_YET_AVAILABLE |
Update call 26.600.0 has not been released on the portal yet. The response contains an error.release field with the target version |
| 422 | BITRIX_ERROR |
The request was rejected by Bitrix24. There is no call with this callId, or its Follow-up is not accessible — the message is "No access to the Follow-up data". The reason for the specific denial is in error.message |
| 429 | RATE_LIMITED |
The request rate on the Bitrix24 side is exceeded |
| 429 | QUEUE_OVERFLOW, QUEUE_TIMEOUT |
The portal request queue is full or the request did not get through the queue in time. The Retry-After header suggests the delay before a repeat request |
| 503 | BITRIX_TIMEOUT |
Bitrix24 accepted the request but did not answer within 15 seconds. A repeat request is safe for reads |
| 502 | BITRIX_UNAVAILABLE |
Bitrix24 is unavailable |
The full list of common API errors — Errors.
Known specifics
A non-existent call cannot be distinguished from an access denial by the response. Both cases come back with the same response. Follow-up list does not answer this either: it contains only calls with a ready Follow-up and only those the employee has access to — a call missing from the list does not mean the call does not exist.
Calls without AI processing. If a call is finished but no Follow-up has been built for it, the method returns an object with metadata: the AI blocks arrive as null and outcomes as an empty array.
Speaker analysis is not available on every Bitrix24 account. If it is unavailable on the account, the insights block arrives with speakerEvaluationAvailable: false and an empty speaker analysis. This is not a request error — the response structure does not change.
Access is limited by employee permissions. The Follow-up is available to whoever took part in the call or is a member of the linked chat — including someone added to the chat after the conversation. The Bitrix24 account administrator sees the Follow-up of any call on the account.