Where the list is enforced
Because the second check runs at send time, a number added to the list after a
campaign launched is still suppressed. Re-queuing a skipped recipient does not
send to a number that is on the list.
Manage the list directly
POST /platform/optouts/batch takes a phones array and adds up to 1,000
numbers in one request. Reading needs a team API key with campaigns:read;
every change needs campaigns:manage. Project tokens are refused on opt-out
routes.
STOP and START replies
When keyword capture is on, a contact who repliesSTOP to one of your campaign
messages is added to the opt-out list, and a contact who replies START is
removed from it.
A reply changes the list only when all of the following hold:
- It is a direct text message, not a group message.
- The whole message matches a configured keyword. Matching ignores letter case
and surrounding punctuation and whitespace, so
STOP,stopandstop!all match.please stopdoes not. - The replying number received a campaign message from your team in the last 30 days.
Configure the keywords
updatedAt is null until you save settings of your
own. PUT replaces all three fields at once: send every one of them, and send
nothing else, because an unrecognized field fails the request.
Set
enabled to false to stop reading replies for keywords. The opt-out list
itself keeps working: existing entries stay suppressed and the API still adds
and removes numbers.
Reading settings needs campaigns:read; changing them needs campaigns:manage.
Both require a team API key.
Webhook events
Subscribe tocontact.opted_out and contact.opted_in to mirror keyword
changes in your own system.
source is always stop-keyword: these two events report keyword replies, not
changes you make through the API or the Console. keyword is the configured
keyword that matched, in upper case. See
Webhooks.