> ## Documentation Index
> Fetch the complete documentation index at: https://rasa.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Call Recording

> Record voice conversations on supported Rasa channels.

<Info>
  **New in 3.19**

  Call recording is generally available in Rasa Pro 3.19.
</Info>

Call recording captures the audio of a voice conversation between a caller
and your Rasa assistant. Use it to review calls, debug voice behaviour, or
keep an audio archive of production conversations.

This page describes how to enable recording, where files are stored, and how
custom connectors can participate.

## Supported channels

Call recording is available on all built-in [voice stream](/docs/pro/build/voice-assistants#voice-stream) channels:

* [AudioCodes Voice Stream](/docs/reference/channels/audiocodes-stream)
* [Jambonz Stream](/docs/reference/channels/jambonz-stream)
* [Twilio Media Streams](/docs/reference/channels/twilio-media-streams)
* [CHIRP](/docs/reference/channels/chirp)
* [Genesys Cloud](/docs/reference/channels/genesys-cloud-voice)
* [SignalWire](/docs/reference/channels/signalwire)
* [Vonage](/docs/reference/channels/vonage)
* [Browser Audio](/docs/pro/testing/trying-assistant#inspecting-voice-assistants) (Voice Inspector)

It is not available on voice-ready connectors such as
[AudioCodes VoiceAI Connect](/docs/reference/channels/audiocodes-voiceai-connect),
[Jambonz](/docs/reference/channels/jambonz), or [Twilio Voice](/docs/reference/channels/twilio-voice).

Custom voice stream connectors can record calls if they use `RecordingSession`
as described in [Custom connectors](#custom-connectors).

## Enable call recording

Add a `recordings` block to `endpoints.yml`. Recording is configured once for
the assistant and applies to every supported channel.

<Tabs>
  <Tab title="Local disk">
    ```yaml title="endpoints.yml" theme={null}
    recordings:
      enabled: true
      provider: local
      local:
        path: ./recordings
    ```
  </Tab>

  <Tab title="Amazon S3">
    ```yaml title="endpoints.yml" theme={null}
    recordings:
      enabled: true
      provider: s3
      s3:
        bucket: your-bucket-name
        region: eu-central-1
        prefix: recordings/
    ```
  </Tab>

  <Tab title="Azure Blob Storage">
    ```yaml title="endpoints.yml" theme={null}
    recordings:
      enabled: true
      provider: azure
      azure:
        container: your-container-name
        account_name: yourstorageaccount
        prefix: recordings/
    ```
  </Tab>
</Tabs>

The `recordings` configuration accepts the following properties:

### General settings

* `enabled` (optional): Turn call recording on or off. Defaults to `false`.
* `provider`: Storage backend for saved recordings. One of `local`, `s3`, or `azure`.

### Local storage

* `path`: Directory on disk where recordings are written. Defaults to `./recordings`.

### Amazon S3

* `bucket`: Name of the S3 bucket where recordings are saved.
* `region`: AWS region of the bucket.
* `prefix`: Key prefix (folder) inside the bucket.

Authenticate with `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, or with an
IAM role that can write to the bucket. See [Amazon S3 Storage](/docs/reference/integrations/model-storage#amazon-s3-storage)
for the same credential pattern used elsewhere in Rasa.

### Azure Blob Storage

* `container`: Name of the Azure container where recordings are saved.
* `account_name`: Storage account that owns the container.
* `prefix`: Blob prefix (folder) inside the container.

Authenticate with `AZURE_ACCOUNT_KEY` (or another credential supported by the
Azure SDK). See [Azure Storage](/docs/reference/integrations/model-storage#azure-storage)
for the same credential pattern used elsewhere in Rasa.

## How recordings work

When recording is enabled, Rasa attaches a `RecordingSession` to each voice
call. User audio from the inbound stream and bot audio from text-to-speech are
written into that session until the call ends. The finished file is then
uploaded or written to the configured provider.

### What is recorded

Rasa records both sides of the call:

* **Caller audio** as it arrives on the voice stream.
* **Assistant audio** as it is sent to the caller (TTS output).

Custom connectors must record bot audio explicitly; see
[Custom connectors](#custom-connectors). If they skip that step, the file
contains only caller audio.

### When recording starts and stops

Recording starts when the voice session is established and stops when the
call ends (hang-up, disconnect, or channel error). There is no separate
start or stop action: if `recordings.enabled` is `true`, every call on a
supported channel is recorded.

### File format and naming

Recordings use the same audio format as the channel. See
[Audio format](/docs/reference/integrations/speech-integrations#audio-format).

Files are stored under the configured `path` or `prefix`. Each call produces
one recording for that session.

## Store and retrieve recordings

Rasa does not serve recordings over an HTTP endpoint. After the call ends,
read the file from the storage you configured:

* **Local:** files in `path` (default `./recordings`). Ensure the process can
  write there. With more than one replica, use a shared volume or a cloud
  provider; local disk is not shared across instances.
* **S3:** objects in `s3://<bucket>/<prefix>`.
* **Azure:** blobs in the given container under `prefix`.

Rasa does not delete recordings. Set retention on the bucket, container, or
disk according to your policy.

## Custom connectors

If you implement a custom voice output channel and override `send_audio_bytes`,
call `record_bot_audio` on `RecordingSession` before sending audio so bot turns
are included in the recording. See [Call recording on streaming channels](/docs/reference/channels/custom-connectors#call-recording-on-streaming-channels)
in the custom connectors reference.

```python title="custom_output_channel.py" theme={null}
async def send_audio_bytes(self, recipient_id: str, audio_bytes: RasaAudioBytes) -> None:
    if self.recording_session is not None:
        self.recording_session.record_bot_audio(audio_bytes)
    # send audio to the voice platform
```

User audio is recorded by the channel as frames arrive. You only need this
hook when you replace the default bot-audio send path.

## Limitations

* Built-in voice stream channels record automatically when `recordings.enabled`
  is `true`. Custom connectors must use `RecordingSession` as described above.
* Overriding `send_audio_bytes` without calling `record_bot_audio` omits
  assistant audio from the file.
* Local storage is not suitable for horizontally scaled deployments unless
  every replica shares the same writable volume.
* Cloud providers require network access and credentials with write
  permission. Failed uploads are not retried as a user-facing download API.
* There is no built-in UI or webhook to play or list recordings.

<Warning>
  **Privacy and compliance**

  Call recordings may contain personal data and payment or health information
  spoken on the call. Confirm that you have a lawful basis to record (including
  caller notice or consent where required), restrict who can read the files, and
  set retention to match your organization's policy and local regulations.
</Warning>


## Related topics

- [Rasa Pro Change Log](/docs/reference/changelogs/rasa-pro-changelog.md)
- [Custom Connectors](/docs/reference/channels/custom-connectors.md)
- [How to Link, Call and Connect Flows](/docs/studio/build/flow-building/linking-flows.md)
- [Patterns](/docs/reference/primitives/patterns.md)
- [Jambonz Voice Stream Channel](/docs/reference/channels/jambonz-stream.md)
