Client Profiles & Sharing
What is a PublicUserProfile?
A PublicUserProfile is a user's shareable data card, distinct from their private account profile (UserProfile). It contains the personal information that organizations need during underwriting.
Fields:
| Field | Type | Notes |
|---|---|---|
| firstName | String (required) | Max 100 chars |
| lastName | String (required) | Max 100 chars |
| dateOfBirth | OffsetDateTime | Optional |
| phoneNumber | String | Optional, max 50 chars |
| String | Optional | |
| bio | String | Optional, max 1000 chars |
| profilePictureUrl | String | Optional |
| preferredLanguage | String | Optional |
| timeZone | String | Optional |
| addresses | List<PublicUserProfileAddress> | Has isDefault flag, ordered DESC |
Multiple profiles per user
A user can have multiple PublicUserProfile records. This allows:
- Different profiles for different organizations (e.g. personal vs business)
- Keeping separate profiles for different application contexts
Sharing with an organization
Sharing is consent-based — the client controls which profile is shared with which org.
Flow:
- Client creates a profile (or staff creates one on their behalf)
- Client shares it with an organization via
sharePublicUserProfile(publicProfileId, orgId) - A
UserProfileSharingrecord is created linking the profile to the org - Org staff can now view and edit the profile
- Client can revoke sharing via
unsharePublicUserProfile(publicProfileId, orgId)
Sharing is idempotent — sharing twice returns the existing record without error.
Staff creating profiles on behalf of clients
Staff with any org role can create a profile on behalf of a client:
Mutation: createClientPublicUserProfile(clientId, orgId, input)
This creates the profile and automatically shares it with the org — no separate sharing step needed. Useful when onboarding clients who haven't set up their own profile yet.
GraphQL API
Queries:
myPublicUserProfiles()— client's own profilespublicUserProfilesByOrg(orgId)— all profiles shared with an org (requires org role)publicUserProfile(id)— single profile by IDpublicUserProfileSharings(publicProfileId)— all sharings for a profile
Mutations:
createPublicUserProfile(input)— owner creates their profileupdatePublicUserProfile(id, input)— update (owner or org member)deletePublicUserProfile(id)— delete (owner only)sharePublicUserProfile(publicProfileId, orgId)— share (owner only)unsharePublicUserProfile(publicProfileId, orgId)— revoke (owner only)createClientPublicUserProfile(clientId, orgId, input)— staff creates for client
How profiles link to applications
When adding an Applicant to an application, the applicant optionally links to a PublicUserProfile via profileId. This is how applicant data (name, DOB, address) flows into the application context.
Staff can inline-edit applicant profiles directly from the application's Applicants tab — this updates the PublicUserProfile in place.
See Applicants for the full applicant model.