Help
Developers

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 textBecomes
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.

On this page