Remove a handle from a contact
Detaches a single handle from a contact and permanently removes it.
Detaches a single handle from a contact and permanently removes it. Both contactId and handleId are path parameters, and the handle must belong to the named contact within your project. Returns 404 if the contact does not exist. Requires the contacts:write scope.
Scope: contacts:write. Send the API key as a bearer token; Scopes lists what each one reaches.
Request
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
contactId | string | yes | The contact's ID. |
handleId | string | yes | The handle's ID. |
Response
200 Success. Body: application/json, DeleteResponse.
| Field | Type | Required | Description |
|---|---|---|---|
deleted | boolean | yes |
Errors
Every error has the same body, {"error": {"type", "code", "message", "param"}}; branch on code. Errors lists every code.
| Status | Meaning |
|---|---|
400 | The request is malformed or a value is invalid (invalid_request, invalid_domain, idempotency_key_mismatch). |
401 | The API key is missing or invalid. |
403 | The key lacks the scope this endpoint needs (scope_missing) or may not do this (not_permitted). |
404 | No such resource in this account (resource_not_found). |
422 | The request is well-formed but a field failed validation (validation_failed). |
429 | Rate limit, plan limit, budget or spend cap reached (rate_limited, plan_limit_reached, budget_exceeded, spend_cap_reached). |
500 | An unexpected error; retry with backoff, then contact support (internal_error). |
Add a handle to a contact
Attaches a new channel address to an existing contact and returns the created handle.
List a contact's message history
Returns the contact's cross-channel message history — inbound and outbound messages merged into a single newest-first list — so you can read the whole relationship across email, a2a, telegram, and other channels in one call.