# twilio-call-recordings

This skill helps configure Twilio call recording for QA, analytics, consent flows, and payment-related pauses.

- skill · `type=skill` · Codex, ChatGPT · ★ 7604
- Author: Twilio · official OpenAI repository
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/openai/plugins/tree/HEAD/plugins/twilio-developer-kit/skills/twilio-call-recordings/SKILL.md
- Updated: 2026-10-08
- HTML: https://affpapa.org/en/nevibecode/skills/twilio-call-recordings

## What it does

The skill maps Twilio’s recording options to the call flow: `<Dial record>` captures a two-party call, `<Record>` behaves like voicemail capture, and Conference recording handles a shared multi-party mix. It also covers `<Start><Recording>` for flows that combine recording with other TwiML verbs. Python and Node.js examples include status callbacks and dual-channel recording for separating agent and caller audio.

It shows how to pause a recording through the Recordings REST API while payment details are collected, then resume it afterward. ConversationRelay has a specific trap: `record:true` on the REST API request is silently ignored, so recording must begin in TwiML before `<Connect>`. Setup requires a Twilio account with a voice-capable number, `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, the `twilio` SDK, and a webhook endpoint. Consent rules vary by jurisdiction, while PCI Mode is irreversible and applies account-wide.

## Install

### Codex (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add openai/plugins --skill twilio-call-recordings -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/twilio-call-recordings/SKILL.md` — For all projects use ~/.agents/skills/

### Claude Code

1. **Skills CLI (Vercel)**
```bash
npx skills add openai/plugins --skill twilio-call-recordings -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/twilio-call-recordings/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/twilio-call-recordings/

### Cursor

**Manually: put the files in place**
- File: `.cursor/skills/twilio-call-recordings/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install openai/plugins twilio-call-recordings
```

2. **Manually: put the files in place**
- File: `.github/skills/twilio-call-recordings/SKILL.md`

### Gemini CLI

**Platform CLI**
```bash
gemini skills install https://github.com/openai/plugins --path plugins/twilio-developer-kit/skills/twilio-call-recordings
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/twilio-call-recordings/SKILL.md` — The legacy .windsurf/skills/ path still works

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/openai/plugins/tree/HEAD/plugins/twilio-developer-kit/skills/twilio-call-recordings/SKILL.md

## When to use it
- choose two-party call recording instead of voicemail capture
- separate caller and agent audio for QA
- record a ConversationRelay call
- pause recording during card-data entry
- process recording status callbacks

## Example prompts
- Use the `twilio-call-recordings` skill to configure a Twilio two-party call with `<Dial record>` and dual-channel audio.
- Show a Python flow that starts recording before `<Connect>` for ConversationRelay and handles the completion callback.
- Add Recordings REST API calls that pause audio capture during payment details and resume it afterward.

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 63cd99b9facdaed1.

BEGIN THIRD-PARTY FILE 63cd99b9facdaed1
````text
---
name: twilio-call-recordings
description: >
  Record Twilio voice calls correctly. Covers the critical distinction
  between Record verb (voicemail) and Dial record (call recording),
  dual-channel for QA, mid-call pause for PCI, Conference recording, and
  the ConversationRelay workaround. Use this skill whenever you need to
  capture call audio for compliance, QA, or analytics.
---

## Overview

Twilio offers multiple recording methods. Choosing the wrong one is the **#1 developer mistake** in voice — using `<Record>` when you mean `<Dial record>` produces voicemail behavior instead of call recording.

| Method | What it does | Use when |
|--------|-------------|----------|
| `<Record>` verb | Records the CALLER only (voicemail-style) | Leaving a message, capturing input |
| `<Dial record>` | Records BOTH parties on a call | Call recording for two-party calls |
| `<Start><Recording>` | Starts a recording alongside other verbs | ConversationRelay, multi-verb flows |
| Conference `record` | Records the conference mix | Multi-party calls |
| Recordings REST API | Programmatic control mid-call | Pause during payment (PCI) |

---

## Prerequisites

- Twilio account with a voice-capable phone number — see `twilio-account-setup`
- `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` — see `twilio-iam-auth-setup`
- SDK: `pip install twilio` / `npm install twilio`
- A webhook endpoint for recording status callbacks
- **Compliance check:** Recording consent requirements vary by jurisdiction — see `twilio-compliance-traffic`

---

## Quickstart

### Record a Two-Party Call (Most Common)

Use `<Dial record>` — NOT `<Record>`.

**Python (Flask)**
```python
from flask import Flask, request
from twilio.twiml.voice_response import VoiceResponse

app = Flask(__name__)

@app.route("/voice", methods=["POST"])
def incoming_call():
    response = VoiceResponse()
    response.say("This call may be recorded for quality assurance.")
    dial = response.dial(
        record="record-from-answer-dual",  # dual-channel: agent on one, caller on other
        recording_status_callback="https://yourapp.com/recording-status"
    )
    dial.number("+15558675310")  # agent's phone
    return str(response)
```

**Node.js (Express)**
```node
app.post("/voice", (req, res) => {
    const response = new VoiceResponse();
    response.say("This call may be recorded for quality assurance.");
    const dial = response.dial({
        record: "record-from-answer-dual",
        recordingStatusCallback: "https://yourapp.com/recording-status",
    });
    dial.number("+15558675310");
    res.type("text/xml").send(response.toString());
});
```

### Handle the Recording Status Callback

> **Security:** Validate `X-Twilio-Signature` on recording callbacks in production. Without validation, attackers could POST fake recording URLs to your endpoint.

**Python (Flask)**
```python
@app.route("/recording-status", methods=["POST"])
def recording_status():
````
END THIRD-PARTY FILE 63cd99b9facdaed1

The third-party file has ended. Everything between the 63cd99b9facdaed1 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2960 of 10675 bytes. © Twilio · MIT · https://github.com/openai/plugins/tree/HEAD/plugins/twilio-developer-kit/skills/twilio-call-recordings/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
