Unsubscribe a contact

Unsubscribe a contact from SMS and/or email — the same toggles as on the contact profile. Bulk SMS and email sends skip unsubscribed contacts.

POST https://api.centerfy.ai/webhooks/inbound/contacts/:id/unsubscribe

Headers

HeaderRequiredValueDescription
x-api-keyYesyour sub-account API key (cfy_…)Authenticates the request; or use Authorization: Bearer <key>.
X-Webhook-SourceNoyour-system-nameOptional loop-prevention label; the outbound trigger won’t echo this change back to the same source.

Path parameters

NameTypeRequiredDescription
idstring (uuid)YesThe contact id.

Body parameters

NameTypeRequiredDefaultDescription
channelsstring[]Yes—Channels to unsubscribe from: one or both of sms, email (no duplicates).

Request body

{
  "channels": [
    "sms",
    "email"
  ]
}

Example

curl -X POST "https://api.centerfy.ai/webhooks/inbound/contacts/{id}/unsubscribe" \
  -H "x-api-key: $CENTERFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "channels": [
    "sms",
    "email"
  ]
}'
import { CenterfyClient } from "@centerfy/sdk";

const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });

const result = await centerfy.contacts.unsubscribe("<contactId>", {
  "channels": [
    "sms",
    "email"
  ]
});
console.log(result);
centerfy contacts unsubscribe <contactId> '{"channels":["sms","email"]}'

MCP tool: centerfy_contacts_unsubscribe (see MCP server)

Response

{
  "status": "success",
  "contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
  "dnc_bypass": false,
  "sms_unsubscribed": true,
  "email_unsubscribed": true
}

Errors

  • 400 — if the id is not a valid UUID or the body is invalid; 404 if the contact is not in this sub-account.

Notes

Channels not listed are left unchanged. For each channel that actually changes, a system note is added to the contact’s conversation (if it has one). Returns the contact’s current consent flags.

© 2026 Centerfy AI. All rights reserved.