Phone numbers are the only identifier you need. Every MRC endpoint
accepts phone numbers directly. Responses include a
memberId (MRC’s
internal contact id) as convenience data you may store and reuse, but no
flow requires it — you never have to create, look up, or manage contacts.Prerequisites
- OAuth — complete the OAuth Integration Guide (OAuth 2.1 Authorization Code + PKCE, one authorization per advisor). Your access token carries the advisor’s identity and your granted scopes.
-
Scopes — the messaging surface uses two:
-
API key — every request also carries your usage-plan key in the
x-api-keyheader, alongside theAuthorization: Bearertoken.
The canonical flow
Send first; handle consent only when the platform tells you to. Most contacts in an advisor’s book have already consented, so the happy path is one call. The three steps in words:- Send the message —
POST /mrc/messaging/messages. A200with your recipient insuccesses[]means the platform accepted it for delivery. Done. - If the recipient appears in
failures[]with a consent message, the advisor’s account requires consent this contact hasn’t granted — request consent withPOST /mrc/messaging/consent-requests, then pollGET /mrc/messaging/consents?phone=…untilstateisaccepted. - Resend the original message. Nothing else changes.
Reading responses
Send-type endpoints are batch operations: they return200 with
per-recipient outcomes rather than failing the whole request when one
recipient can’t receive.
successes[]— accepted for delivery; keepmessageIdfor your records (it will drive delivery-status lookups when that endpoint releases).failures[]— human-readable, per-recipient reasons. Today these are strings; a structuredfailureDetailsarray with stable reason codes is planned and will be additive (the strings will not change shape).
Error handling
Whole-request problems use real HTTP status codes with an RFC 7807application/problem+json
body — never a 200 in disguise:
The
type URL of every problem resolves to a page describing that code; the
full list is in Errors. Include the traceId in any
support request. Unknown fields you send in
request bodies are ignored (stripped), so additive changes on your side are
safe.
Behaviors worth knowing
- Consent requests have no cooldown — the API behaves exactly like the advisor’s in-app “request consent” button. If you retry, throttle yourself.
- Sending to an unknown phone number creates a contact on the advisor’s account (and may import from the advisor’s CRM). Existing contacts are never modified by API traffic.
- SMS only at launch. Media/MMS is a fast-follow; a media field will be added to the send request when it is released to partner applications.
- Scheduled sends are supported on the send call
(
scheduleDelivery+deliveryDate+frequency). - Delivery status endpoint is coming. Until it releases, a
successes[]entry means the platform and carrier pipeline accepted the message.
Integration checklist
- OAuth flow completed per advisor; tokens refreshed server-side
-
x-api-keyon every request - Send → check
failures[]for consent → request consent → poll → resend - Poll cadence: 30s for the first 5 minutes, then every 5 minutes, stop at 24h
-
429/5xxretried with backoff;traceIdlogged - Phone numbers in E.164 (
+12185551234) — required on every phone field; other formats are rejected with a400