<PHONE_NUMBER>”.
The agent is never redacted. The model hears the caller’s words and can book the appointment with the number it was given. A warm transfer’s operator is briefed on them, and post-call analysis and takeaways read them. Only what they produce is redacted on the way out.
Detection runs inside your deployment, with Presidio and spaCy’s small English model. No text is sent to a vendor to be redacted.
Turn it on
PUT replaces the whole setting, so enabled is required: a body without it is a 422. The project read (GET /v1/projects/{id}) shows it under redaction.
A change applies to what is stored or sent next, including on a call that is already live: at once on the server that took the PUT, and within 30 seconds on your other servers, which cache the setting for that long. Nothing stored before it is rewritten. For a call that was already live, the lines stored before the change stay as they were, in the transcript read and in that call’s call.ended.
Turning it on also starts loading the detector in the background, which takes a few seconds. A server that starts while any project has redaction on loads it at startup.
Entity types
entities chooses what to replace. Leave it out, or send null, to get the default:
You can also choose
PERSON, LOCATION, DATE_TIME, ORGANIZATION, URL, IP_ADDRESS, US_BANK_NUMBER, US_DRIVER_LICENSE, US_PASSPORT, US_ITIN, UK_NHS, MEDICAL_LICENSE, CRYPTO, MAC_ADDRESS, AGE and NRP. An unknown name is a 422.
PERSON is not in the default because the small model gets names wrong. “Hi, this is Ava from Acme Dental” becomes “Hi, this is Ava from <PERSON>”: the company is taken for a person, and the name is missed.
What is redacted
- The transcript:
GET /v1/calls/{id}/transcript, andtranscriptincall.ended. - Every call event: on the event log (
GET /v1/calls/{id}/events) and in every webhook. That includes tool arguments and results intool.result, and a call’smetadataincall.ended. - The numbers in payloads: with
PHONE_NUMBERchosen,from_number,to_number,customer_number,turncall_number,target_numberandnumberare replaced whole. The call record keeps them:GET /v1/calls/{id}still showsfrom_number, and routing, the suppression list and campaigns work as before. - Post-call analysis and takeaways: stored redacted on the call, so
analysisonGET /v1/calls/{id}andGET /v1/calls/{id}/analysismatchsummaryandanalysisincall.ended.
from and to of provider.failover) and tool names (tool_name). With ORGANIZATION chosen, “Azure” in a provider name stays as it is.
Not yet redacted: the call record’s own metadata and numbers (the numbers stay on purpose, see above), tool-invocation records, SMS and chat messages, logs and traces.
Never redacted: call-init and tool webhooks. These are part of the live call, and your own server answers them with the raw values.
Limits
- Recall is the detector’s. It finds what the STT wrote as digits. “Four one five, five five five…” spelled out in words is missed, and so is “jane dot doe at example dot com”. Deepgram’s default formatting writes digits; check your STT provider’s.
- English only.
- Text only. The recording is not bleeped. If it holds PII, turn recording off or keep it for a short time.
- Briefings and analysis read from memory. The server that ran the call holds the conversation for five minutes after it ends, and nowhere else: it is never written to Redis or the database. When the carrier’s callback or the call’s end lands on another server, that server asks the one holding the conversation to build the briefing or run the analysis (over Redis, naming only the call). When no server holds it any more (a restart, after the five minutes, or
POST /v1/calls/{id}/analysis/rerunlater on), they read the stored, redacted transcript instead, and the server logstransfer_briefing_from_stored_transcriptorpost_call_analysis_from_stored_transcript. - When the detector can’t keep up, text is withheld. It never goes out raw. If the detector fails to load, every analysed string becomes
<REDACTED>for five minutes (logged once, asredaction_unavailable), then the load is tried again. If a server falls far behind, text is withheld rather than queued (redaction_backlog_full_withheld), and a redaction that takes over a second is logged asredaction_slow. - It runs in a process of its own. Each server runs the detector in one worker process, which holds about 200 MB once loaded, so its CPU work stays out of the process that carries live calls’ audio.