Delete Contact (GDPR purge)

Beta
Erase a person: the contact, every identifier that resolves to them, every per-agent caller record of them, and every memory ever extracted about them - on every agent and every channel, in one call. This is the right-to-be-forgotten path. `DELETE /v1/agents/callers/{caller_id}` erases one agent's record of someone and has to be fired once per agent and once per channel; this reaches all of them, because "everything about this person" is a question the contact model can answer. Conversations survive - they are the billing and forensic record - but the facts extracted from them, and the copies of those facts frozen into past prompts, do not. The identifiers are tombstoned as part of the purge, which is what stops the person's phone number ever resolving again: a later merge naming the purged contact moves rows that are already dead rather than bringing a link back to life. Idempotent: re-deleting an already-purged contact returns all zeros rather than a 404, so a client that never saw the first response can safely repeat it. Returns `200` with the row counts rather than a bodiless `204`: the counts are the audit evidence a privacy operator needs, and re-reading a corpus you just asked us to erase is not a way to obtain them. Same deliberate exception `DELETE /v1/agents/callers/{caller_id}` takes.

Authentication

AuthorizationBearer

Enter your API key with the Bearer prefix, e.g. ‘Bearer sk_…’.

Path parameters

contact_idstringRequired

Contact id (prefixed external id, contact_...).

Headers

Speechify-VersionstringOptional

Response headers

Speechify-Request-IdstringOptional
Unique identifier for this request, present on every response (2xx and non-2xx alike). If the caller sends a `Speechify-Request-Id` request header the server echoes it back (sanitized and length-capped) so one logical request can be traced end-to-end; otherwise the server generates a fresh value. Log it on every response and quote it in support requests - it is the stable handle that ties your observation to Speechify's server-side logs, and it matches the `request_id` field in the error envelope. The legacy alias `X-Request-ID` carries the same value and is still accepted on requests, until 2027-07-24. Prefer the un-prefixed name (RFC 6648).

Response

Purge completed; row counts in the body (GDPR audit evidence).

contact_purgedinteger
1 when this call tombstoned the contact, 0 when it was already gone.
identifiers_purgedinteger
Identifiers tombstoned. They stop resolving immediately, so a future call or session on that channel mints a fresh contact.
callers_purgedinteger

Per-agent caller records tombstoned.

memories_purgedinteger

Memory rows erased, across every agent and channel - reached by contact, by caller record, and by the stored caller identity, so a row is not missed because of which key it happened to be written under.

runs_erasedintegerOptional

Durable runs whose content was scrubbed: the instruction, the variables, the output and every journalled step, which together carry the person verbatim. The run row itself stays, with its status, timings and usage - what the workspace was billed for is not the person’s to erase.

Errors

401
Unauthorized Error
403
Forbidden Error
404
Not Found Error