What your assistant can see
Conversations carry what a visitor asked. By default the API masks who they were, and reading them verbatim is a separate scope nobody gets by accident.
A conversation is the most useful thing ShowPilot holds and the most sensitive. What a visitor asked — in their words, unprompted — is not in anyone's analytics. Their email address is in everyone's.
So the two are separated. Content is the value; identity is the risk.
The default
GET /v1/conversations/{id} with the conversations:read scope returns every message, with the people masked:
{
"id": "c0000001-…",
"messages": [
{ "id": "m1", "content": "Do you support SCIM?", "redacted": false },
{ "id": "m2", "content": "I am [name] — mail [email] or call [phone].", "redacted": true }
],
"redaction": {
"note": "1 email address, 1 phone number and 1 name masked. Ask for the conversations:transcripts scope to read them verbatim.",
"masked": { "email": 1, "phone": 1, "name": 1 }
}
}What gets masked, and what it becomes:
| In the text | Becomes |
|---|---|
| An email address, including one spelled "sam at acme dot com" | [email] |
| A phone number, in any of the shapes people type | [phone] |
| A payment card number | [card number] |
| A run of nine or more digits — an account or national id | [long number] |
| The visitor's own name, wherever it appears | [name] |
The masks say what they replaced rather than just [redacted], so a transcript still reads as English and an assistant reasoning about "they gave us a work address" can see that they did.
Two details worth knowing. The visitor's known email and name are masked wherever they appear, not only where a pattern matches — a name written on its own, or an address in unusual capitals, is still caught. And ordinary figures survive: "250 seats on the 2026 plan" is content, not identity.
Reading them verbatim
Add conversations:transcripts to an API key. Then the same call returns the messages untouched and redaction is null.
It is never granted implicitly. A key gets it only because someone ticked it. In particular, connecting an MCP client — Claude, Cursor, ChatGPT — gives that client the scopes your organization role carries, and this is not one of them, even for an organization admin. A person plugging an assistant into their workspace should not thereby hand a third party every verbatim transcript. If that is what you want, mint a key for it deliberately.
Identity, when you need it
Every conversation carries visitorId. GET /v1/visitors/{id} with visitors:read returns the person — email, name, account, CRM ids — because at that point you asked for them on purpose. Masking the transcript is not an attempt to hide who the visitor was; it stops identity travelling inside content that is often on its way somewhere else.
What this is not
Masking is pattern work plus the values we already hold. It is a strong default, not a compliance guarantee: a visitor who types their address in a way nothing recognises will not be caught, and nothing here removes identity from the account and CRM fields on other endpoints. Treat it as what it is — the difference between a transcript that leaks a person by default and one that does not.
Offers
Read, create and change the plays your agent delivers — the copy, the call to action, who sees them on arrival, and what converting means.
Scripts and skills as documents
Read, propose, apply and publish an agent's script and its skills from any harness, with base versions so nobody's edits are lost.