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:
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; the
mediaIdfield in the spec is not yet available 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) — other common formats are accepted, E.164 is unambiguous