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

# Data and security

> What SignalMD stores from your Retell calls, who processes it, how it is secured, and how it is retained and deleted.

SignalMD reads your production calls, so you will want to know what it keeps and who can see it. This page describes what the product does today, not a certification.

## What SignalMD stores

| Data | What it holds |
| - | - |
| Call records | Everything Retell sent for each call, as received: the transcript with tool calls and results, timings, variables, the agent version, the caller's phone number, and links to the recordings |
| Traces | SignalMD's step-by-step reading of each call, made from the call record. See [Traces](/concepts/traces) |
| Analyses | What SignalMD's analysis concluded about each call: who called and why, how it ended, findings with short quotes |
| Agent configuration | Each version's prompts, flow, tools and settings, as Retell returns them |
| Issues and comparisons | The board, flow snapshots and version comparisons built from the above |
| Brief | The [brief](/concepts/the-brief), your edits to it, and your chat about it |
| Tests and runs | Tests built from calls, with personal values masked, plus simulated conversations and their results |
| Copilot | Conversations, drafts and their test results |
| Credentials | Your Retell keys and webhook signing secrets, encrypted. API keys, as one-way hashes |
| Billing | Your plan, its status and period, and counts of what you used |

**Recordings.** SignalMD does not copy or store audio. The call page plays each recording from Retell's link in your browser. Where SignalMD's analysis uses a recording, it reads it from Retell and keeps only the result, never the audio.

**Why the original record is kept.** When SignalMD's analysis improves, calls you already have get the better reading from the stored record, without being fetched from Retell again. Calls are stored per workspace: if two workspaces connect the same Retell agent, each keeps its own copy.

## Who processes your data

SignalMD runs in one region, US East, and there is no choice of region. It uses these kinds of third-party service:

| Service | What it does for SignalMD | What it handles |
| - | - | - |
| Cloud hosting and database, US East | Runs SignalMD and stores its data | All call data, and everything SignalMD stores |
| Web hosting | Serves the web app | The app's code only. Call data comes from SignalMD's API |
| Sign-in and billing | Accounts, organizations and plans | Names, email addresses, organization membership, plan |
| Stripe | Card payments | Payment details. SignalMD never receives card numbers |
| Third-party AI model providers, under no-retention terms | Read your calls and power the copilot | Transcripts and agent configuration, not retained |
| Product analytics, US | Product analytics, error reports and masked session recordings | See [What product analytics receives](#what-product-analytics-receives) |
| Backup storage | Holds a nightly encrypted backup | Encrypted backup, kept 14 days |

If your review needs the providers' names, ask through **Contact us** on **Plan and usage**.

### AI model providers

SignalMD sends real transcripts to third-party AI model providers, including names and any details callers give. Analysis, brief drafting, the copilot and its quick checks all do this. In production these requests go only to providers under no-retention terms, which do not keep what SignalMD sends or train on it. If no such provider is available for a request, the request fails. It does not fall back to one that retains data.

### What product analytics receives

* **In the browser:** page views, clicks, web performance and errors, with all text masked. Session recordings show layout, clicks and scrolling with every character and input masked, including the Retell key field. Network bodies and console logs are not recorded. SignalMD tells the analytics service who is signed in: your user id, email address and workspace id.
* **On the server:** product events such as "agent connected" or "api key created", with ids, counts and fixed values, plus server errors. Nothing a person typed is sent.
* No transcript text goes to product analytics.

## Security

### Workspaces and roles

Everything is scoped to a workspace: an organization, or your personal workspace. A request for an agent in another workspace gets "not found", so ids cannot be probed.

An organization has two roles: admin and member. In a personal workspace you are the admin. Anyone who can sign in sees all the workspace's agents, calls and transcripts. Only an admin can:

* connect an agent or change its Retell key, and delete an agent
* change an agent's testing settings
* make or revoke a **Write** API key
* publish a draft to the live agent, or roll one back

Members can draft changes, run tests, use the copilot and make **Read** keys. You invite and remove people, and delete the organization, on the **Organization** page.

Copilot conversations are private to the person who started them. Drafts are shared with the workspace. One read-only demo agent, built from synthetic calls, is visible to every workspace, and every write to it is refused.

**SignalMD's own access.** SignalMD has no published access policy yet. If you need to know who at SignalMD can reach production data, and how that access is logged, ask through **Contact us** on **Plan and usage** before you connect an agent.

### Keys and secrets

* **Retell keys** are encrypted before they are stored. SignalMD uses them only as described under [Changes to your Retell agent](#changes-to-your-retell-agent).
* **API keys** are shown once. SignalMD stores a one-way hash and the first characters so you can tell keys apart. A key is **Read** or **Write**, belongs to one workspace, and can be tied to one agent. A **Write** key has a monthly budget it cannot exceed. See [Authentication](/api/authentication).
* No key can change settings, connect or import, delete anything, approve a run, calibrate tests, manage keys or webhooks, or publish a change to your agent. The API and the [MCP server](/mcp/overview) have no operations for these.
* Anyone holding a key can read the workspace's calls and transcripts, so treat it as a secret. Revoke it on the **API keys** page and it stops working at once.
* Failed authentication attempts are limited per address. See [Limits and quotas](/limits#api-rate-limits).

### Webhook signatures

SignalMD checks every webhook it receives. A call webhook from Retell must carry Retell's signature, checked with the key you connected for that agent, or it is refused.

SignalMD signs the webhooks it sends too. When a run ends, SignalMD posts its result to the endpoints you add under **API keys**. Each delivery carries a header:

```text Header theme={null}
Signal-Signature: t=1760000000,v1=<hex digest>
```

The digest is HMAC-SHA256 of `<t>.<raw body>`, keyed with the endpoint's signing secret. The secret starts with `whsec_`, is shown once when you add the endpoint, and is stored encrypted. Use the whole string as the key, and compute over the raw body before any JSON parsing.

```javascript Node.js theme={null}
import { createHmac, timingSafeEqual } from "node:crypto";

export function verifySignalWebhook(secret, header, rawBody) {
  const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
  const timestamp = Number(parts.t);
  if (!Number.isInteger(timestamp) || !parts.v1) return false;
  if (Math.abs(Date.now() / 1000 - timestamp) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1, "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}
```

Reject a timestamp more than 5 minutes old, because it may be a replay. The `Signal-Delivery` header is the same on every retry, so you can drop duplicates. Endpoints must use https and be reachable on the public internet. SignalMD does not follow redirects. A failed delivery is tried 5 more times over about 7 hours.

## Changes to your Retell agent

SignalMD reads your agent with the key you connect. It lists calls and reads agents, flows, tools, knowledge bases and phone numbers, and never changes your live agent from an import.

| What | When it happens |
| - | - |
| Test runs | Only if you turn testing on with a separate Retell key and a monthly budget. SignalMD creates test definitions and runs them in your Retell workspace. Retell bills these runs to you, within that budget |
| Shadow copies | For testing a change. A copy of one version is made in your Retell workspace, named **\[Signal shadow]**, with no webhook address and no phone number. SignalMD writes only to copies it made |
| Publishing a draft | Only when a signed-in admin selects publish on a draft in **Build**, or rolls one back. The copilot cannot do it. API keys and MCP cannot reach it |

A publish also checks that your live agent is still the version the draft was written against. If someone changed it in Retell since, SignalMD refuses and does not overwrite it.

Tests built from your calls mask personal values before anything reaches Retell: names, phone numbers, email addresses and addresses become consistent fake values. Masking is not complete: a name that only the caller said aloud can pass through.

## Deleting data and retention

### Retention

SignalMD has no automatic retention period. What it stores stays until you delete it.

| Data | How long SignalMD keeps it |
| - | - |
| Calls, raw records, traces, analyses, issues, versions, tests, runs | Until you delete the agent or the workspace |
| Copilot conversations | Until you delete them in the copilot panel, or delete the workspace. They stay if you delete the agent |
| Usage counts for billing | Until the workspace is deleted. They hold Retell call ids and quantities, never call content |
| Backups | 14 days, encrypted, so deleted data stays in them until they expire. The hosting provider also keeps a short restore window of its own |
| AI model providers | Not retained: requests go only to providers under no-retention terms |
| Product analytics | Held by the analytics provider. Deleting a workspace does not remove events already sent |

### Deleting

* **Delete an organization, or your account for a personal workspace.** An organization admin deletes the organization on the **Organization** page. SignalMD then erases the whole workspace: calls and raw records, traces, analyses, issues, versions, tests, runs, copilot conversations and drafts, keys, webhooks, usage counts and your stored Retell keys. Deletion is permanent.
* **Delete one agent.** An admin selects **Delete agent** under **Connection** on the agent's **Agent config** page. Deleting an agent erases its calls, raw records, traces, analyses, issues, versions, tests and drafts, and its stored Retell key unless another agent uses it. Copilot conversations are kept, because they belong to the person. Delete those in the copilot panel.
* **Retell.** SignalMD never deletes anything in your Retell workspace. Recordings, shadow copies and test definitions stay there until you delete them in Retell.

There is no control to delete a single call or erase one caller's data. To ask for that, or if a deletion above did not take effect, select **Contact us** on **Plan and usage** and include the workspace and the calls or caller you mean.

## Compliance

SignalMD is built for personal data such as names, phone numbers and addresses. It is not built for protected health information, and you should not connect an agent whose calls contain health records. This page makes no claim of SOC 2, HIPAA, GDPR or any other certification, because SignalMD does not state one.

Your callers' data is yours. SignalMD holds it to analyse your agent. Whether you must tell callers, or sign a data processing agreement first, is for you and your own advisers. If you need a data processing agreement or other terms from SignalMD, ask through **Contact us**.

## Next steps

<CardGroup cols={2}>
  <Card title="Connect Retell" icon="plug" href="/guides/connect-retell">
    What SignalMD asks for when you connect an agent.
  </Card>

  <Card title="Limits and quotas" icon="gauge" href="/limits">
    Plan credits, rate limits and import size.
  </Card>
</CardGroup>


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