# Recording Configurations resource

> \[!WARNING]
>
> For Customers building HIPAA-compliant workflows with [Recordings](/docs/voice/api/recording), we require customers to enforce at least HTTP Authentication. To learn more about building for HIPAA compliance, please visit the latest requirements [here](https://docs-resources.prod.twilio.com/documents/architecting-for-HIPAA.pdf).

> \[!NOTE]
>
> Call recordings aren't Payment Card Industry (PCI) compliant by default. To use Voice Recordings in a [PCI workflow](/docs/voice/pci-workflows), [enable PCI Mode in the Twilio Console](https://www.twilio.com/console/voice/settings).
>
> To transcribe voice recordings, use the \<Transcription> TwiML noun. Native and Marketplace transcriptions aren't available when PCI Mode is enabled.

The Voice Recording Configuration resource represents recording settings associated with a voice call or conference. With the Voice Recording Configuration resource, you can apply, update, retrieve, and delete recording settings in one place. Defining and applying a Voice Recording Configuration is equivalent to using individual programmatic API parameters in your code or TwiML, but you must choose one approach or the other. A recording workflow can include either a Voice Recording Configuration ID or programmatic parameters, but not both: mixing the two affects the recording composition. To use a Voice Recording Configuration, apply the configuration ID to the `recordingConfigurationId` parameter of the following recording methods:

1. [`<Record>` in TwiML](/docs/voice/twiml/record)
2. [`<Dial record>` in TwiML](/docs/voice/twiml/dial#record)
3. [`<Conference record>` in TwiML](/docs/voice/twiml/conference#record)
4. [`<Record=true>` in an outbound call using the REST API](/docs/voice/tutorials/how-to-make-outbound-phone-calls#record-your-call)
5. [`POST` to Recording resource of an in-progress Call SID](/docs/voice/api/recording)
6. [`<Start><Recording>` in TwiML](/docs/voice/twiml/recording)

> \[!NOTE]
>
> The Voice Recording Configuration resource is only available in the `us1` region.

## Create a Recording Configuration

```bash
curl -X POST "https://voice.twilio.com/v2/Configurations/Recording" \
  -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "unique_name": "my_recording_config",
    "description": "My recording configuration",
    "configuration": {
      "configurationType": "Recording",
      "compositionPolicy": {
        "channels": "dual",
        "trim": "trim-silence"
      },
      "callRecordingStatusCallback": {
        "url": "https://example.com/call-recording-status",
        "method": "POST",
        "events": ["in-progress", "completed"]
      }
    }
  }'
```

```json
{
    "account_sid": "ACxxxxxxxxxxxxxxxxxxxxx",
    "configuration": {
        "configurationType": "Recording",
        "compositionPolicy": {
            "channels": "dual",
            "trim": "trim-silence"
        },
        "callRecordingStatusCallback": {
            "url": "https://example.com/call-recording-status",
            "method": "POST",
            "events": ["in-progress", "completed"]
        }
    },
    "description": "My recording configuration",
    "unique_name": "my_recording_config",
    "date_created": "2026-04-15T11:00:00Z",
    "date_updated": "2026-04-15T11:00:00Z",
    "id": "voice_recordingconfiguration_xxxxxxxxx"
}
```

### Request body parameters

| Parameter       | Type   | Required | Description                                                                                        |
| :-------------- | :----- | :------- | :------------------------------------------------------------------------------------------------- |
| `unique_name`   | string | No       | A unique, human-readable name for this configuration. Cannot contain spaces.                       |
| `description`   | string | No       | A description of this configuration.                                                               |
| `configuration` | object | Yes      | The configuration object. See [Configuration object properties](#configuration-object-properties). |

### Configuration object properties

| Property                            | Type   | Required | Description                                                                                                                                                |
| :---------------------------------- | :----- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `configurationType`                 | string | Yes      | Must be `Recording`.                                                                                                                                       |
| `compositionPolicy`                 | object | No       | The composition configuration for recordings. See [compositionPolicy properties](#compositionpolicy-properties).                                           |
| `callRecordingStatusCallback`       | object | No       | Callback configuration for individual (call) recording status. See [callRecordingStatusCallback properties](#callrecordingstatuscallback-properties).      |
| `conferenceRecordingStatusCallback` | object | No       | Callback configuration for conference recording status. See [conferenceRecordingStatusCallback properties](#conferencerecordingstatuscallback-properties). |
| `features`                          | array  | No       | The features to apply to this recording. Up to three features can be added to the `features` object. See [features properties](#features-properties).      |

### compositionPolicy properties

| Property   | Type   | Description                                                                                                                                                                                                                                           |
| :--------- | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `channels` | string | The number of channels used in the recording. Can be: `mono` or `dual` and the default is `dual`. `mono` records all parties of the call into one channel. `dual` records each party of a 2-party call into separate channels.                        |
| `trim`     | string | Whether to trim any leading and trailing silence in the recording. Can be: `trim-silence` or `do-not-trim` and the default is `do-not-trim`. `trim-silence` trims the silence from the beginning and end of the recording and `do-not-trim` does not. |

### callRecordingStatusCallback properties

| Property | Type   | Description                                                                                                                                                                                                                                                 |
| :------- | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `url`    | string | The URL we should call using the method on each recording event specified in the events property of the `callRecordingStatusCallback` object.                                                                                                               |
| `method` | string | The HTTP method we should use to call `call_recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`.                                                                                                                                  |
| `events` | array  | The recording status events on which we should call the `call_recording_status_callback` URL. Can be: `in-progress`, `completed`, `failed`, and `absent` and the default is `completed`. Separate multiple values with a space, ex: 'in-progress completed' |

### conferenceRecordingStatusCallback properties

| Property | Type   | Description                                                                                                                                                                                                                                                                  |
| :------- | :----- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `url`    | string | The URL we should call using the method on each conference recording event specified in the events property of the `conferenceRecordingStatusCallback` object.                                                                                                               |
| `method` | string | The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`.                                                                                                                                             |
| `events` | array  | The conference recording status events on which we should call the `conference_recording_status_callback` URL. Can be: `in-progress`, `completed`, `failed`, and `absent` and the default is `completed`. Separate multiple values with a space, ex: 'in-progress completed' |

### features properties

| Property      | Type   | Required | Description                                                                                   |
| :------------ | :----- | :------- | :-------------------------------------------------------------------------------------------- |
| `type`        | string | Yes      | The type of feature to apply to the recording. Possible values: `transcriptionConfiguration`. |
| `featureId`   | string | Yes      | The ID of the feature.                                                                        |
| `description` | string | No       | The description of the feature.                                                               |

> \[!NOTE]
>
> The Batch Transcription Configuration accepts only dual-channel recordings. Twilio stores all call recordings (where `track` = `both`) and conference recordings (with the [Dual-channel Recording for Conference Console setting enabled](https://1console.twilio.com/)) in a dual-channel format by default. These recordings can be transcribed regardless of whether `channels` is set to `mono` or `dual`.

## Examples of using a Recording Configuration

### Record an outbound call using a Voice Recording Configuration

```bash
curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls.json" \
  -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  --data-urlencode "Url=http://demo.twilio.com/docs/voice.xml" \
  --data-urlencode "To=+15558675310" \
  --data-urlencode "From=+15017122661" \
  --data-urlencode "Record=true" \
  --data-urlencode "RecordingConfigurationId=voice_recordingconfiguration_xxxxxxxxxxxxxxxxxxxxxxxxxx"
```

### Record a conference participant using a Voice Recording Configuration

```bash
curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Conferences/CFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Participants.json" \
  -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  --data-urlencode "To=+15558675310" \
  --data-urlencode "From=+15017122661" \
  --data-urlencode "Label=customer" \
  --data-urlencode "StatusCallback=https://myapp.com/events" \
  --data-urlencode "StatusCallbackEvent=ringing" \
  --data-urlencode "Record=true" \
  --data-urlencode "RecordingConfigurationId=voice_recordingconfiguration_xxxxxxxxxxxxxxxxxxxxxxxxxx"
```

### Record a call with `<Start><Recording>` and a Voice Recording Configuration

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Start>
    <Recording recordingConfigurationId="voice_recordingconfiguration_xxxxxxxxxxxxxxxxxxxxxxxxxx" />
  </Start>
  <Say>The recording has started.</Say>
</Response>
```

## Retrieve a Recording Configuration

```bash
curl -X GET "https://voice.twilio.com/v2/Configurations/Recording/voice_recordingconfiguration_xxxxxxx" \
  -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"
```

```json
{
    "account_sid": "ACxxxxxxxxxxxxxxxxxxxxx",
    "configuration": {
        "configurationType": "Recording",
        "compositionPolicy": {
            "channels": "dual",
            "trim": "trim-silence"
        },
        "callRecordingStatusCallback": {
            "url": "https://example.com/call-recording-status",
            "method": "POST",
            "events": ["in-progress", "completed"]
        }
    },
    "description": "My recording configuration",
    "unique_name": "my_recording_config",
    "date_created": "2026-04-15T11:00:00Z",
    "date_updated": "2026-04-15T11:00:00Z",
    "id": "voice_recordingconfiguration_xxxxxxxxx"
}
```

## Update a Recording Configuration

```bash
curl -X PUT "https://voice.twilio.com/v2/Configurations/Recording/voice_recordingconfiguration_xxxxxxx" \
  -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "unique_name": "my_updated_recording_config",
    "description": "Updated recording configuration",
    "configuration": {
      "configurationType": "Recording",
      "compositionPolicy": {
        "channels": "mono",
        "trim": "do-not-trim"
      },
      "callRecordingStatusCallback": {
        "url": "https://example.com/updated-callback",
        "method": "POST",
        "events": ["completed"]
      }
    }
  }'
```

```json
{
    "account_sid": "ACxxxxxxxxxxxxxxxxxxxxx",
    "configuration": {
        "configurationType": "Recording",
        "compositionPolicy": {
            "channels": "mono",
            "trim": "do-not-trim"
        },
        "callRecordingStatusCallback": {
            "url": "https://example.com/updated-callback",
            "method": "POST",
            "events": ["completed"]
        }
    },
    "description": "Updated recording configuration",
    "unique_name": "my_updated_recording_config",
    "date_created": "2026-04-15T11:00:00Z",
    "date_updated": "2026-04-15T12:00:00Z",
    "id": "voice_recordingconfiguration_xxxxxxxxx"
}
```

> \[!NOTE]
>
> If you omit a parameter or set its value to `null` in the update request, Twilio either sets the value to `null` or returns an error, depending on whether the field is required.

## Delete a Recording Configuration

```bash
curl -X DELETE "https://voice.twilio.com/v2/Configurations/Recording/voice_recordingconfiguration_xxxxxxx" \
  -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"
```
