senderZ handles the core CTIA / TCPA obligations automatically. You do not run a separate STOP list, do not register a 10DLC campaign, and do not write a HELP autoresponder.
STOP keyword (opt-out)
Inbound message normalized to one of:
STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT
Triggers:
- We INSERT a row in
opt_outsfor(tenant_id, phone_number). - Future sends from any of your API keys to that number fail at the router with
403 OPTED_OUT. - You still receive the
message.receivedwebhook for the STOP message itself.
The opt-out registry is per-tenant. Two different tenants in our system maintain independent opt-out lists.
START keyword (opt-in)
Inbound message normalized to START, UNSTOP, or YES re-enables sends to that number for the same tenant.
HELP keyword (autoresponse)
Inbound HELP / INFO / AIDE triggers a CTIA-compliant outbound reply assembled from your persona profile:
{business_name}: For support, contact {help_contact}. Reply STOP to unsubscribe.
business_name comes from ai_personas.business_name, falling back to tenants.name. help_contact comes from ai_personas.voice_handoff_number. When neither is set we send a generic fallback.
Override the HELP text
Set ai_personas.help_response via PUT /v1/ai/persona:
curl -X PUT https://api.senderz.com/v1/ai/persona \
-H "Authorization: Bearer tf_live_YOUR_KEY" \
-d '{
"help_response": "Bella Cafe support: bella@example.com. Reply STOP to unsubscribe."
}'
When help_response is set, it replaces the entire template (no variable substitution).
Quiet hours
Marketing messages (message_type: "marketing") are blocked between 20:00 and 08:00 in the recipient’s local time zone. OTP and alert types are exempt — emergency comms must always go through.
A2P 10DLC
senderZ does not use 10DLC. We deliver via a proprietary iMessage bridge with SMS fallback through dedicated devices, not via long-code carrier registration. You do not need a Brand or Campaign at The Campaign Registry. Same for toll-free verification — irrelevant.
If your downstream compliance program asks “what’s your 10DLC campaign ID?” the answer is “we don’t operate on 10DLC.”
Phone warming
New numbers in our pool ramp up traffic gradually to avoid carrier filtering:
| Days since first send | Daily new-contact cap per number |
|---|---|
| 1–7 | 10 |
| 8–14 | 25 |
| 15+ | 50 |
This is the routing layer enforcing it on your behalf — you don’t see the cap directly, just longer queue times when too many new contacts hit one number.
Consent log
Every send records the consent state we believed at send time. Pull the audit trail with:
curl https://api.senderz.com/v1/compliance/consent \
-H "Authorization: Bearer tf_live_YOUR_KEY"
Related
- Webhooks — STOP/HELP message visibility