Skip to content

Member integration

  1. Read GET /api/v1/{orgId}/notification-options with notifications:read.
  2. Resolve a member with POST /api/v1/{orgId}/auth/external/resolve and identity:resolve.
  3. Read or update preferences through the external-ID routes.
  4. Optionally create a launch link so the member can manage their own settings.

External identities are scoped by organization and provider. Use stable provider and external IDs, and URL-encode path segments. Phone numbers must be international E.164, such as +12025550123.

{
"provider": "your_membership_system",
"externalId": "member_123",
"firstName": "Example",
"lastName": "Member",
"email": "member@example.com"
}

Resolution can create records. It is not proof of messaging consent.

Use GET or PUT /api/v1/{orgId}/members/by-external-id/{provider}/{externalId}/prefs. Reads need members:read; writes need members:write.

{
"topics": {
"facilityOverride": ["email"],
"YOUR_AREA_ID": ["sms", "email"]
},
"email": "member@example.com"
}

Topics map identifiers to channel arrays, not boolean values. Obtain valid identifiers from notification options. Email availability depends on a usable email address. Submit the complete intended topic map and read it back: do not assume PUT merges each topic exactly like a PATCH. Never use roster presence as consent.

POST /api/v1/{orgId}/members/batch-sync accepts provider and a nonempty members array of at most 250 entries. Each entry needs externalId and can contain profile fields. Explicitly supply your provider; the implementation defaults to courtreserve.

Processing is sequential and not atomic. An error can occur after earlier members have been persisted, and entries without an external ID are skipped. Reconcile results rather than assuming all-or-nothing success. This does not delete absent roster members.

POST /api/v1/{orgId}/auth/launch-link requires auth:launch-link. Supply target: "memberPrefs" plus a resolved provider and externalId. The result contains ssoUrl and expiresAt. The default lifetime is 10 minutes; configured requests are bounded to 1 minute–30 days. Prefer short lifetimes.

Launch links are bearer credentials. Deliver only to the intended authenticated user, keep them out of analytics and logs, and do not cache them. An adminPanel target additionally requires an active organization admin record.

GET /api/v1/{orgId}/members/report accepts topic, channel, and format=json|csv. There is no pagination parameter in this handler. Protect exports as personal data. Notification logs use /api/v1/{orgId}/notification-logs, with limit defaulting to 50 and capped at 200.