# CRM call transcripts

`GET /v1/activities/:activityId/transcript`

Returns the ready-made AI transcript of a client call logged in CRM as a Call activity and processed in your Bitrix24 account by CoPilot. The method only reads an existing transcript — it does not trigger generation.

Bitrix24 API: `crm.activity.call.getTranscript`
Scope: `crm`

## Parameters

| Parameter | Type | Required | Description |
|----------|------|:--------:|-------------|
| `activityId` (path) | number | yes | ID of the call activity. List: [`GET /v1/activities`](/docs/entities/activities/list) |

## Examples

### curl — personal key

```bash
curl "https://vibecode.bitrix24.com/v1/activities/12345/transcript" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl "https://vibecode.bitrix24.com/v1/activities/12345/transcript" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/activities/12345/transcript', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { data } = await res.json()
if (data.transcription === null) {
  // no transcript yet — this is not an error
} else {
  console.log(data.transcription)
}
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/activities/12345/transcript', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { data } = await res.json()
```

## Response fields

| Field | Type | Description |
|------|------|-------------|
| `transcription` | string \| null | The full transcript text. A `null` value comes back with status `200` when there is no transcript for the call yet — the call was not processed or processing did not finish. Check `data.transcription === null` |

## Response example

Transcript is ready:

```json
{
  "success": true,
  "data": {
    "transcription": "Hello, how can I help you?"
  }
}
```

No transcript yet — `transcription` is `null`, the status stays `200`:

```json
{
  "success": true,
  "data": {
    "transcription": null
  }
}
```

## Error response example

403 — no access to the transcript:

```json
{
  "success": false,
  "error": {
    "code": "BITRIX_ACCESS_DENIED",
    "message": "Access denied",
    "hint": "Access denied to this call transcript. Two possible causes: (1) the API key owner lacks read access to a CRM entity bound to this call activity, or (2) AI call processing is not enabled on this portal. Verify the user's CRM permissions, and confirm AI call processing (transcription) is turned on."
  }
}
```

## Errors

| HTTP | Code | Description |
|------|------|-------------|
| 403 | `BITRIX_ACCESS_DENIED` | One code for two causes: no rights to the CRM entity the call is bound to, or AI call processing is disabled on the portal. The `hint` field names both |
| 403 | `SCOPE_DENIED` | The API key has no `crm` scope |
| 400 | `INVALID_PARAMS` | `activityId` is not a positive integer |
| 401 | `TOKEN_MISSING` | The API key has no tokens configured |
| 404 | `ENTITY_NOT_FOUND` | No activity with this `activityId`, or it has no CRM bindings |

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

## Known specifics

- The transcript is available only if the key has read access to at least one CRM entity — a deal, lead, contact or company — the call is bound to. AI call processing (CoPilot) must also be enabled in your Bitrix24 account.
- The transcript does not appear instantly: Bitrix24 builds it after the call ends. While processing is not finished, `transcription` is `null` with status `200`. Retry the request later.

## See also

- [Get activity](/docs/entities/activities/get)
- [List activities](/docs/entities/activities/list)
- [Activity bindings](/docs/entities/activities/bindings)
- [Limits and optimization](/docs/optimization)
