The consent model
Every contact’s messaging number has one consent state on the advisor’s account:
Two account-level settings (managed by the firm, not your app) shape the
behavior you’ll observe:
- Consent enabled — if the firm doesn’t require consent, sends never block and states are irrelevant to you.
- Response required — some firms accept “notified” as consent: the
consent request itself flips the contact to
acceptedwithout waiting for a reply. Others require the contact to reply (e.g. “ACCEPT”) before the state changes.
Don’t branch on these settings — you can’t read them, and you don’t need
to. The send response tells you everything: blocked sends land in
failures[], allowed sends in successes[].The conditional consent path
1. Request consent
consentState in the response tells you where things landed
immediately — on “response required” firms it will be pending; on
notify-only firms it can already be accepted, in which case skip polling
and resend now.
Behavior notes:
- No cooldown — this is the same operation as the advisor’s in-app “request consent” button, and like the button it will happily send again if you call it again. Throttle re-requests on your side.
- Already accepted →
400— requesting consent for a number that has already opted in is rejected; check status first if you’re unsure. - Account not configured for consent →
409 conflict— the firm’s group hasn’t set up consent collection; this needs FMG configuration, not a retry. - Batch is supported: pass several
phoneNumbersand read per-numbersuccesses[]/failures[].
2. Poll consent status
lastChanged is epoch milliseconds of the last state change —
useful for showing “requested 2 hours ago” in your UI. Lookup by memberId
query parameter is also supported if you stored one.
3. Resend
Whenstate is accepted, resend the original message — the same POST /messages call from step 0. Nothing about the send changes.
Opt-outs
Contacts can reply STOP at any time; MRC handles the reply, confirms the unsubscribe to the contact, and blocks subsequent sends to them (those sends land infailures[]). START re-subscribes. Your app doesn’t manage any
of this — just keep reading the per-recipient outcomes.