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

# PII Redaction

> Automatically detect and remove sensitive information from transcripts and audio recordings

export const CopyPageButton = () => {
  if (typeof window !== 'undefined') {
    setTimeout(function () {
      if (document.getElementById('ck-tools')) return;
      var anchor = document.getElementById('content-area') || document.querySelector('.mdx-content');
      if (!anchor) return;
      if (!document.getElementById('ck-style')) {
        var s = document.createElement('style');
        s.id = 'ck-style';
        s.textContent = '#ck-tools{position:absolute;top:6px;right:0;z-index:100;font-family:inherit;}' + '.ck-row{display:inline-flex;align-items:stretch;border:1px solid rgba(0,0,0,0.15);border-radius:8px;overflow:hidden;background:#fff;}' + ':root.dark .ck-row{background:rgba(255,255,255,0.06);border-color:rgba(255,255,255,0.12);}' + '.ck-btn{padding:5px 12px;border:none;background:none;cursor:pointer;font-size:13px;font-weight:500;font-family:inherit;color:#374151;}' + ':root.dark .ck-btn{color:#d1d5db;}' + '.ck-btn:hover{background:rgba(0,0,0,0.04);}' + ':root.dark .ck-btn:hover{background:rgba(255,255,255,0.06);}' + '.ck-chevron{padding:5px 8px;border:none;background:none;cursor:pointer;font-size:14px;font-family:inherit;color:#374151;}' + ':root.dark .ck-chevron{color:#d1d5db;}' + '.ck-chevron:hover{background:rgba(0,0,0,0.04);}' + ':root.dark .ck-chevron:hover{background:rgba(255,255,255,0.06);}' + '.ck-divider{width:1px;background:rgba(0,0,0,0.12);flex-shrink:0;}' + ':root.dark .ck-divider{background:rgba(255,255,255,0.12);}' + '.ck-dd{position:absolute;top:calc(100% + 4px);right:0;min-width:180px;background:#fff;border:1px solid rgba(0,0,0,0.12);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.1);padding:4px;display:none;z-index:200;}' + ':root.dark .ck-dd{background:#1f2937;border-color:rgba(255,255,255,0.1);box-shadow:0 4px 16px rgba(0,0,0,0.35);}' + '.ck-item{display:block;width:100%;padding:7px 12px;border:none;background:none;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit;text-align:left;color:#374151;}' + ':root.dark .ck-item{color:#d1d5db;}' + '.ck-item:hover{background:rgba(0,0,0,0.05);}' + ':root.dark .ck-item:hover{background:rgba(255,255,255,0.07);}';
        document.head.appendChild(s);
      }
      var wrap = document.createElement('div');
      wrap.id = 'ck-tools';
      var row = document.createElement('div');
      row.className = 'ck-row';
      var mainBtn = document.createElement('button');
      mainBtn.className = 'ck-btn';
      mainBtn.textContent = 'Copy page';
      var divider = document.createElement('span');
      divider.className = 'ck-divider';
      var chevron = document.createElement('button');
      chevron.className = 'ck-chevron';
      chevron.textContent = '▾';
      var dd = document.createElement('div');
      dd.className = 'ck-dd';
      function closeDD() {
        dd.style.display = 'none';
      }
      function openDD() {
        dd.style.display = 'block';
      }
      chevron.onclick = function (e) {
        e.stopPropagation();
        if (dd.style.display === 'block') {
          closeDD();
        } else {
          openDD();
        }
      };
      document.addEventListener('click', function (e) {
        if (!e.target.closest('#ck-tools')) {
          closeDD();
        }
      });
      document.addEventListener('keydown', function (e) {
        if (e.key === 'Escape') {
          closeDD();
        }
      });
      function makeItem(label, fn) {
        var b = document.createElement('button');
        b.className = 'ck-item';
        b.textContent = label;
        b.onclick = function () {
          fn();
          closeDD();
        };
        return b;
      }
      function getMarkdown() {
        var walk = function (node) {
          if (!node) return '';
          if (node.nodeType === 3) return node.textContent || '';
          if (node.nodeType !== 1) return '';
          var tag = node.tagName.toLowerCase();
          var skip = ['script', 'style', 'svg', 'noscript', 'button', 'iframe'];
          if (skip.indexOf(tag) !== -1) return '';
          if (node.id === 'ck-tools') return '';
          var ch = Array.from(node.childNodes).map(walk).join('');
          if (tag === 'h1') return '\n# ' + ch.trim() + '\n\n';
          if (tag === 'h2') return '\n## ' + ch.trim() + '\n\n';
          if (tag === 'h3') return '\n### ' + ch.trim() + '\n\n';
          if (tag === 'p') return '\n' + ch.trim() + '\n\n';
          if (tag === 'pre') return '\n```\n' + node.textContent.trim() + '\n```\n\n';
          if (tag === 'li') return '- ' + ch.trim() + '\n';
          if (tag === 'code') return '`' + ch.trim() + '`';
          return ch;
        };
        var content = document.querySelector('.mdx-content') || document.getElementById('content-area') || document.body;
        return walk(content).replace(/\n\n\n+/g, '\n\n').trim();
      }
      function copyMd() {
        var md = getMarkdown();
        navigator.clipboard.writeText(md).then(function () {
          mainBtn.textContent = 'Copied!';
          setTimeout(function () {
            mainBtn.textContent = 'Copy page';
          }, 2000);
        });
      }
      function viewMd() {
        var md = getMarkdown();
        var safe = md.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;');
        var html = '<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{font-family:monospace;max-width:860px;margin:40px auto;padding:0 24px;line-height:1.7;white-space:pre-wrap;word-wrap:break-word}</style></head><body>' + safe + '</body></html>';
        window.open(URL.createObjectURL(new Blob([html], {
          type: 'text/html'
        })), '_blank');
      }
      function openClaude() {
        var prompt = 'Can you read this Cekura docs page ' + window.location.href + ' so I can ask you questions?';
        window.open('https://claude.ai/new?q=' + encodeURIComponent(prompt), '_blank');
      }
      mainBtn.onclick = copyMd;
      dd.appendChild(makeItem('Copy page', copyMd));
      dd.appendChild(makeItem('View as Markdown', viewMd));
      dd.appendChild(makeItem('Open in Claude', openClaude));
      row.appendChild(mainBtn);
      row.appendChild(divider);
      row.appendChild(chevron);
      wrap.appendChild(row);
      wrap.appendChild(dd);
      anchor.style.position = 'relative';
      anchor.insertBefore(wrap, anchor.firstChild);
    }, 50);
  }
  return null;
};

<CopyPageButton />

## What is PII Redaction?

PII redaction automatically detects and removes sensitive information from both transcripts and audio recordings. This ensures compliance with privacy and security requirements while maintaining the overall context of conversations.

This page covers **server-side** redaction: you send the call to Cekura with `redact_fields`, and Cekura detects and removes the entities from the stored transcript and recording. It is the option to use for audio, and for open-vocabulary entities such as names and locations that need model-based detection.

<Note>
  If raw PII must never leave your network, or your organization requires that its own model providers do the detection, see [Client-Side Redaction](/documentation/guides/observability/client-side-redaction) — a script that detects and removes PII from both the transcript and the recording, using your own LLM and speech-to-text providers, before anything is sent. It also covers `metadata`, `dynamic_variables` and `customer_number`, which `redact_fields` does not reach. The two approaches can be combined.
</Note>

### Example

**Original:**

```
[00:04] Main Agent: Thank you for calling the office of Guernsey County Sheriff, Jeffrey d Peyton. How can I help?
```

**Redacted:**

```
[00:04] Main Agent: Thank you for calling the office of <LOCATION>, <PERSON>. How can I help?
```

**Audio Example:**

<div style={{ display: 'flex', justifyContent: 'center', margin: '0px 0' }}>
  <iframe src="https://drive.google.com/file/d/14B2W9JaHeWAAxgpMRFh6trsKyxF9wHB_/preview" width="65%" height="70" frameBorder="0" allow="autoplay" style={{ borderRadius: '8px' }} />
</div>

## How It Works

<Tabs>
  <Tab title="Transcript Redaction">
    We identify the entities to be redacted from the call using state of the art models. We then replace the text with relevant placeholders.

    **Example tokens:**

    * `<PERSON>` - Person names
    * `<LOCATION>` - Geographic locations
    * `<EMAIL>` - Email addresses
    * `<PHONE>` - Phone numbers
    * `<SSN>` - Social Security Numbers
    * `<CREDIT_CARD>` - Credit card numbers
  </Tab>

  <Tab title="Audio Redaction">
    We identify the entities to be redacted from the call using state of the art models. We then replace the audio segments with relevant placeholders.

    <Note>
      Audio redaction ensures that even if someone accesses the recording file directly, they cannot hear sensitive information.
    </Note>
  </Tab>
</Tabs>

## Using Redaction

Redaction can be configured at two levels:

<Tabs>
  <Tab title="Agent-Level (Default)">
    Configure `redact_fields` on your agent via the [agent API](/api-reference/test_framework/update-agent-partial). Once set, redaction applies automatically to every call ingested for that agent — including auto-imported and webhook calls — without any per-call parameters.

    Set `redact_fields` inside the `provider` block when creating or updating an agent:

    ```json theme={null}
    {
      "provider": {
        "redact_fields": ["phone_number", "email_address", "ssn"]
      }
    }
    ```

    To disable agent-level redaction, set the field to an empty array:

    ```json theme={null}
    {
      "provider": {
        "redact_fields": []
      }
    }
    ```
  </Tab>

  <Tab title="Per-Call Override">
    Override the agent default by passing `redact_fields` when sending a call to the [observe API endpoint](/api-reference/observability/send-calls):

    ```json theme={null}
    {
      "agent": "your_agent_id",
      "transcript_json": [...],
      "voice_recording_url": "https://...",
      "redact_fields": ["phone_number", "email_address", "ssn"]
    }
    ```

    Per-call fields take precedence over the agent's configuration for that call only.
  </Tab>
</Tabs>

<Note>
  When `redact_fields` is omitted from a per-call request, the agent's configured redaction fields apply. If the agent has no redaction fields configured either, no redaction occurs.
</Note>

`redact_fields` applies to `transcript_json` and the audio recording. Values in `metadata`, `dynamic_variables` and `customer_number` are stored exactly as you send them — scrub those [before sending](/documentation/guides/observability/client-side-redaction).

## Available Fields

* `person_name` - Person names
* `age` - Age information
* `phone_number` - Phone numbers
* `email_address` - Email addresses
* `date` - Specific dates
* `time` - Time information
* `location` - Physical locations and addresses
* `origin` - Origin information
* `gender_sexuality` - Gender and sexuality information
* `physical_attribute` - Physical descriptions
* `occupation` - Occupation details
* `username` - Usernames
* `password` - Passwords
* `ip_address` - IP addresses
* `url` - URLs
* `filename` - File names
* `event` - Event information
* `vehicle_id` - Vehicle identification numbers
* `dob` - Date of birth
* `healthcare_number` - Healthcare identification numbers
* `medical_professional` - Medical professional information
* `credit_card` - Credit card numbers
* `account_number` - General account numbers
* `bank_account` - Bank account numbers
* `money` - Financial amounts
* `ssn` - Social Security Numbers
* `passport_number` - Passport numbers
* `driver_license` - Driver's license numbers
* `numerical_pii` - Other numerical PII

## Pricing

<Info>
  Redacting any fields costs **0.1 credits per minute** by default, regardless of how many fields are selected.
</Info>

## Implementation Examples

<CodeGroup>
  ```json Healthcare Compliance theme={null}
  {
    "agent": "agent_healthcare",
    "transcript_json": [...],
    "voice_recording_url": "https://recordings.example.com/medical_call.mp3",
    "redact_fields": [
      "person_name",
      "dob",
      "healthcare_number",
      "medical_professional",
      "location"
    ]
  }
  ```

  ```json Financial Services theme={null}
  {
    "agent": "agent_banking",
    "transcript_json": [...],
    "voice_recording_url": "https://recordings.example.com/banking_call.mp3",
    "redact_fields": [
      "person_name",
      "phone_number",
      "email_address",
      "credit_card",
      "ssn",
      "bank_account"
    ]
  }
  ```

  ```json Basic Redaction theme={null}
  {
    "agent": "agent_123",
    "transcript_json": [...],
    "voice_recording_url": "https://recordings.example.com/call_456.mp3",
    "redact_fields": ["phone_number", "email_address"]
  }
  ```
</CodeGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.