# Members ## List members `client.members.list(MemberListParamsquery?, RequestOptionsoptions?): PageNumberPage` **get** `/v2/members` Retrieves a paginated list of the members in the authenticated organization's book — identity, contact details, and address. The book covers members reached through an employer in the organization's book as well as members of a group it owns. Supports free-text search (name, email, or exact member id). ### Parameters - `query: MemberListParams` - `limit?: number` Items per page (default: 20, max: 100) - `page?: number` Page number (default: 1) - `search?: string` Case-insensitive search across member name and email; exact match on member id ### Returns - `MemberListResponse` A member in the organization's directory: identity, contact details, address, and join date. - `id: string` Unique member identifier with 'mbr_' prefix - `first_name: string` Member's legal first name - `last_name: string` Member's legal last name - `address?: Address | null` Member's residential address - `address_line_1: string` Primary street address - `city: string` City name - `state: "AL" | "AK" | "AZ" | 59 more` * `AL` - AL * `AK` - AK * `AZ` - AZ * `AR` - AR * `CA` - CA * `CO` - CO * `CT` - CT * `DC` - DC * `DE` - DE * `FL` - FL * `GA` - GA * `HI` - HI * `ID` - ID * `IL` - IL * `IN` - IN * `IA` - IA * `KS` - KS * `KY` - KY * `LA` - LA * `ME` - ME * `MD` - MD * `MA` - MA * `MI` - MI * `MN` - MN * `MS` - MS * `MO` - MO * `MT` - MT * `NE` - NE * `NV` - NV * `NH` - NH * `NJ` - NJ * `NM` - NM * `NY` - NY * `NC` - NC * `ND` - ND * `OH` - OH * `OK` - OK * `OR` - OR * `PA` - PA * `RI` - RI * `SC` - SC * `SD` - SD * `TN` - TN * `TX` - TX * `UT` - UT * `VT` - VT * `VA` - VA * `WA` - WA * `WI` - WI * `WV` - WV * `WY` - WY * `PR` - PR * `GU` - GU * `AS` - AS * `VI` - VI * `MP` - MP * `MH` - MH * `PW` - PW * `FM` - FM * `AE` - AE * `AA` - AA * `AP` - AP - `"AL"` - `"AK"` - `"AZ"` - `"AR"` - `"CA"` - `"CO"` - `"CT"` - `"DC"` - `"DE"` - `"FL"` - `"GA"` - `"HI"` - `"ID"` - `"IL"` - `"IN"` - `"IA"` - `"KS"` - `"KY"` - `"LA"` - `"ME"` - `"MD"` - `"MA"` - `"MI"` - `"MN"` - `"MS"` - `"MO"` - `"MT"` - `"NE"` - `"NV"` - `"NH"` - `"NJ"` - `"NM"` - `"NY"` - `"NC"` - `"ND"` - `"OH"` - `"OK"` - `"OR"` - `"PA"` - `"RI"` - `"SC"` - `"SD"` - `"TN"` - `"TX"` - `"UT"` - `"VT"` - `"VA"` - `"WA"` - `"WI"` - `"WV"` - `"WY"` - `"PR"` - `"GU"` - `"AS"` - `"VI"` - `"MP"` - `"MH"` - `"PW"` - `"FM"` - `"AE"` - `"AA"` - `"AP"` - `zipcode: string` ZIP code (5 or 9 digit) - `address_line_2?: string | null` Secondary street address (apt, suite, etc.) - `email?: string | null` Email address - `phone?: string | null` Phone number (10-digit US domestic string) ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); // Automatically fetches more pages as needed. for await (const memberListResponse of client.members.list()) { console.log(memberListResponse.id); } ``` #### Response ```json { "data": [ { "id": "mbr_abc123def456", "first_name": "Jane", "last_name": "Doe", "email": "jane.doe@example.com", "phone": "4155550100", "address": { "address_line_1": "123 Main Street", "address_line_2": "Apt 4B", "city": "San Francisco", "state": "CA", "zipcode": "94102" } } ], "pagination": { "page": 1, "limit": 20, "total": 1, "total_pages": 1 } } ``` ## Get member `client.members.retrieve(stringmemberID, RequestOptionsoptions?): MemberRetrieveResponse` **get** `/v1/members/{member_id}` Retrieves a member's profile by ID — identity, demographics, address, contact details, tobacco status, and profile status. Access is scoped to the authenticated principal; a member not visible to the caller returns a 404. ### Parameters - `memberID: string` Unique member identifier (mbr_*) ### Returns - `MemberRetrieveResponse` Response containing a single member resource. - `data: Data` A member's profile: identity, contact details, address, demographics, and onboarding status. - `id: string` Unique member identifier with 'mbr_' prefix - `age: number` Member's age in years, derived from date of birth - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `first_name: string` Member's legal first name - `last_name: string` Member's legal last name - `name: string` Member's full legal name - `status: "onboarded" | "pending_onboarding"` Member profile status (onboarded or pending onboarding) - `"onboarded"` - `"pending_onboarding"` - `address?: Address | null` Member's residential address - `address_line_1: string` Primary street address - `city: string` City name - `state: "AL" | "AK" | "AZ" | 59 more` * `AL` - AL * `AK` - AK * `AZ` - AZ * `AR` - AR * `CA` - CA * `CO` - CO * `CT` - CT * `DC` - DC * `DE` - DE * `FL` - FL * `GA` - GA * `HI` - HI * `ID` - ID * `IL` - IL * `IN` - IN * `IA` - IA * `KS` - KS * `KY` - KY * `LA` - LA * `ME` - ME * `MD` - MD * `MA` - MA * `MI` - MI * `MN` - MN * `MS` - MS * `MO` - MO * `MT` - MT * `NE` - NE * `NV` - NV * `NH` - NH * `NJ` - NJ * `NM` - NM * `NY` - NY * `NC` - NC * `ND` - ND * `OH` - OH * `OK` - OK * `OR` - OR * `PA` - PA * `RI` - RI * `SC` - SC * `SD` - SD * `TN` - TN * `TX` - TX * `UT` - UT * `VT` - VT * `VA` - VA * `WA` - WA * `WI` - WI * `WV` - WV * `WY` - WY * `PR` - PR * `GU` - GU * `AS` - AS * `VI` - VI * `MP` - MP * `MH` - MH * `PW` - PW * `FM` - FM * `AE` - AE * `AA` - AA * `AP` - AP - `"AL"` - `"AK"` - `"AZ"` - `"AR"` - `"CA"` - `"CO"` - `"CT"` - `"DC"` - `"DE"` - `"FL"` - `"GA"` - `"HI"` - `"ID"` - `"IL"` - `"IN"` - `"IA"` - `"KS"` - `"KY"` - `"LA"` - `"ME"` - `"MD"` - `"MA"` - `"MI"` - `"MN"` - `"MS"` - `"MO"` - `"MT"` - `"NE"` - `"NV"` - `"NH"` - `"NJ"` - `"NM"` - `"NY"` - `"NC"` - `"ND"` - `"OH"` - `"OK"` - `"OR"` - `"PA"` - `"RI"` - `"SC"` - `"SD"` - `"TN"` - `"TX"` - `"UT"` - `"VT"` - `"VA"` - `"WA"` - `"WI"` - `"WV"` - `"WY"` - `"PR"` - `"GU"` - `"AS"` - `"VI"` - `"MP"` - `"MH"` - `"PW"` - `"FM"` - `"AE"` - `"AA"` - `"AP"` - `zipcode: string` ZIP code (5 or 9 digit) - `address_line_2?: string | null` Secondary street address (apt, suite, etc.) - `email?: string | null` Email address - `gender?: "Male" | "Female" | "Transgender" | 2 more | null` * `Male` - Male * `Female` - Female * `Transgender` - Transgender * `Non-binary` - Non Binary * `Prefer not to respond` - Prefer Not To Respond - `"Male"` - `"Female"` - `"Transgender"` - `"Non-binary"` - `"Prefer not to respond"` - `marital_status?: "Single" | "Married" | null` * `Single` - Single * `Married` - Married - `"Single"` - `"Married"` - `middle_name?: string | null` Member's legal middle name - `phone?: string | null` Phone number (10-digit US domestic string) - `preferred_language?: "en" | "es" | "zh" | 3 more | null` * `en` - English * `es` - Spanish * `zh` - Chinese * `ru` - Russian * `sw` - Swahili * `th` - Thai - `"en"` - `"es"` - `"zh"` - `"ru"` - `"sw"` - `"th"` - `sex_at_birth?: "Male" | "Female" | "Other" | "Unknown" | null` * `Male` - Male * `Female` - Female * `Other` - Other * `Unknown` - Unknown - `"Male"` - `"Female"` - `"Other"` - `"Unknown"` - `suffix?: "Sr" | "Jr" | "I" | 4 more | null` * `Sr` - Sr * `Jr` - Jr * `I` - I * `II` - II * `III` - III * `IV` - IV * `V` - V - `"Sr"` - `"Jr"` - `"I"` - `"II"` - `"III"` - `"IV"` - `"V"` - `tobacco_status?: boolean | null` Whether the member uses tobacco, if known ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); const member = await client.members.retrieve('mbr_abc123def456'); console.log(member.data); ``` #### Response ```json { "data": { "id": "mbr_abc123def456", "name": "Jane Doe", "first_name": "Jane", "middle_name": null, "last_name": "Doe", "suffix": null, "email": "jane.doe@example.com", "phone": "4155550100", "address": { "address_line_1": "123 Main Street", "address_line_2": "Apt 4B", "city": "San Francisco", "state": "CA", "zipcode": "94102" }, "date_of_birth": "1990-04-12", "age": 36, "sex_at_birth": "Female", "gender": "Female", "preferred_language": "en", "tobacco_status": false, "status": "onboarded" } } ``` ## List member dependents `client.members.listDependents(stringmemberID, RequestOptionsoptions?): MemberListDependentsResponse` **get** `/v1/members/{member_id}/dependents` Lists a member's active legal dependents — name, relationship, date of birth, age, and sex at birth. Access is scoped to the authenticated principal; a member not visible to the caller returns a 404. ### Parameters - `memberID: string` Unique member identifier (mbr_*) ### Returns - `MemberListDependentsResponse` Unpaginated `{"data": [...]}` list of member dependents. - `data: Array` - `age: number` Dependent's age in years, derived from date of birth - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `first_name: string` Dependent's first name - `last_name: string` Dependent's last name - `member_id: string` The dependent's own member identifier with 'mbr_' prefix - `primary_member_id: string` The primary member's identifier with 'mbr_' prefix - `relationship: "Spouse" | "Child"` * `Spouse` - Spouse * `Child` - Child - `"Spouse"` - `"Child"` - `sex_at_birth?: "Male" | "Female" | "Other" | "Unknown" | null` * `Male` - Male * `Female` - Female * `Other` - Other * `Unknown` - Unknown - `"Male"` - `"Female"` - `"Other"` - `"Unknown"` ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); const response = await client.members.listDependents('mbr_abc123def456'); console.log(response.data); ``` #### Response ```json { "data": [ { "name": "Sam Doe", "relationship": "Child", "date_of_birth": "2015-06-01", "age": 11, "sex_at_birth": "Male" } ] } ``` ## List member employments `client.members.listEmployments(stringmemberID, RequestOptionsoptions?): MemberListEmploymentsResponse` **get** `/v1/members/{member_id}/employments` Lists a member's employment across every employer — the same employee record shape as the employer's employees list, plus the employer name. For an organization caller the rows are scoped to companies in that organization's book; a member (self/household) or Vitable Admin sees all employments. A member not visible to the caller returns a 404. ### Parameters - `memberID: string` Unique member identifier (mbr_*) ### Returns - `MemberListEmploymentsResponse` Unpaginated `{"data": [...]}` list of member employments. - `data: Array` - `id: string` Unique employee identifier with 'empl_' prefix - `classification_effective_date: string` Date the employee's current classification took effect - `compensation_type: "Salary" | "Hourly" | null` * `Salary` - Salary * `Hourly` - Hourly - `"Salary"` - `"Hourly"` - `compensation_type_effective_date: string` Date the employee's current compensation type took effect - `created_at: string` Timestamp when the employee was created - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `deductions: Array` Payroll deductions from the most recent statement period. Replaced when a new statement is generated. - `benefit_name: string` Name of the benefit plan - `deduction_amount_in_cents: number` Employee deduction amount in cents - `deduction_category: string | null` Deduction category (reserved for future use) - `frequency: "weekly" | "bi_weekly" | "semi_monthly" | "monthly"` * `weekly` - Weekly * `bi_weekly` - Bi Weekly * `semi_monthly` - Semi Monthly * `monthly` - Monthly - `"weekly"` - `"bi_weekly"` - `"semi_monthly"` - `"monthly"` - `period_end_date: string` Period end date (YYYY-MM-DD) - `period_start_date: string` Period start date (YYYY-MM-DD) - `tax_classification: "Unknown" | "Pre-tax" | "Post-tax"` * `Unknown` - Unknown * `Pre-tax` - Pre Tax * `Post-tax` - Post Tax - `"Unknown"` - `"Pre-tax"` - `"Post-tax"` - `email: string` Email address - `employee_class: EmployeeClass` * `Full Time` - Full Time * `Part Time` - Part Time * `Temporary` - Temporary * `Intern` - Intern * `Seasonal` - Seasonal * `Individual Contractor` - Individual Contractor - `"Full Time"` - `"Part Time"` - `"Temporary"` - `"Intern"` - `"Seasonal"` - `"Individual Contractor"` - `employer_id: string` Unique identifier of the employer this employment is with (empr_*) - `first_name: string` Employee's legal first name - `last_name: string` Employee's legal last name - `member_id: string` Unique member identifier with 'mbr_' prefix - `phone: string | null` Phone number (10-digit US domestic string) - `start_date: string` Employee's start date with the employer - `status: "active" | "terminated"` Employee status (active or terminated) - `"active"` - `"terminated"` - `updated_at: string` Timestamp when the employee was last updated - `address?: Address | null` Employee's residential address - `address_line_1: string` Primary street address - `city: string` City name - `state: string` Two-letter state code (e.g., CA, NY) - `zipcode: string` ZIP code (5 or 9 digit) - `address_line_2?: string | null` Secondary street address (apt, suite, etc.) - `employer_name?: string | null` Name of the employer this employment is with - `gender?: string | null` Gender identity, if provided - `reference_id?: string | null` Partner-assigned reference ID for the employee - `suffix?: string | null` Name suffix (e.g., Jr., Sr., III) - `termination_date?: string | null` Employee's termination date, if terminated ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); const response = await client.members.listEmployments('mbr_abc123def456'); console.log(response.data); ``` #### Response ```json { "data": [ { "id": "empl_abc123def456", "member_id": "mbr_abc123def456", "employer_name": "Acme Corp", "first_name": "Jane", "last_name": "Doe", "employee_class": "full_time", "status": "active", "start_date": "2024-01-15", "termination_date": null, "compensation_type": "salary" } ] } ``` ## List member enrollments `client.members.listEnrollments(stringmemberID, RequestOptionsoptions?): MemberListEnrollmentsResponse` **get** `/v1/members/{member_id}/enrollments` Lists a member's benefit enrollments across every employer — benefit type and product, employer, carrier, plan, tier, employee deduction, employer contribution and total premium, the individual enrollment coverage boundary (`coverage_end`), the separate pre-effective cancellation boundary (`cancelled_date`), and the distinct benefit plan-year boundary (`plan_year_coverage_end`) used to determine whether the plan year itself has ended, whether a qualifying life event would currently be required for reissue under the product/open-enrollment rule, enrollment/open-enrollment window, and two statuses: `election_status` (what the member answered) and `policy_status` (what became of their coverage, null unless they enrolled). Every row includes a stable enrollment ID and the exact employer and benefit plan-year IDs used to fetch that row's plan-year detail. The full list is returned across all states so the client derives active plans (effective and upcoming) and the enrollment history from those per-row statuses. For an organization caller the rows are scoped to companies in that organization's book; a member (self/household) or Vitable Admin sees all enrollments. A member not visible to the caller returns a 404. ### Parameters - `memberID: string` Unique member identifier (mbr_*) ### Returns - `MemberListEnrollmentsResponse` Unpaginated `{"data": [...]}` list of member enrollments. - `data: Array` - `id: string` Opaque, stable enrollment identifier used to target enrollment actions - `benefit_plan_year_id: string` Exact benefit plan-year identifier for this enrollment - `benefit_type: "Medical" | "Dental" | "Vision" | "Hospital"` * `Medical` - Medical * `Dental` - Dental * `Vision` - Vision * `Hospital` - Hospital - `"Medical"` - `"Dental"` - `"Vision"` - `"Hospital"` - `cancelled_date: string | null` Earliest applicable coverage boundary (YYYY-MM-DD) when coverage was cancelled before its effective start; null unless the enrollment was cancelled - `election_status: "Enrolled" | "Waived" | "Pending" | "Expired"` * `Enrolled` - Enrolled * `Waived` - Waived * `Pending` - Pending * `Expired` - Expired - `"Enrolled"` - `"Waived"` - `"Pending"` - `"Expired"` - `employer_id: string` Exact employer identifier for this enrollment - `employer_name: string` Name of the employer the enrollment is through - `enrollment_window_start: string` Enrollment / open-enrollment window start date (YYYY-MM-DD) - `in_last_month_of_coverage: boolean` True when today falls in the final month of the plan-year coverage window; drives end-of-coverage enrollment actions on the client. - `is_within_enrollment_window: boolean` True when today falls inside the enrollment window this member has to answer in; drives enrollment-action availability on the client. - `plan_year_coverage_end: string | null` Benefit plan-year coverage end date (YYYY-MM-DD), distinct from this enrollment's coverage_end; null when the plan year is open-ended - `policy_status: "Coverage Upcoming" | "Coverage Effective" | "Coverage Ended" | "Cancelled" | null` * `Coverage Upcoming` - Coverage Upcoming * `Coverage Effective` - Coverage Effective * `Coverage Ended` - Coverage Ended * `Cancelled` - Cancelled - `"Coverage Upcoming"` - `"Coverage Effective"` - `"Coverage Ended"` - `"Cancelled"` - `product_code: "EBA" | "VPC" | "VPC_CORE" | 12 more` * `EBA` - Eba Mec * `VPC` - Vpc Enhanced * `VPC_CORE` - Vpc Core * `MEC` - Vpc Mec * `MEC2` - Mec2 * `MEC_PLUS` - Mec Plus * `MVP` - Mvp * `MVP2` - Mvp2 * `MVPSL` - Mvpsl * `MVPSL2` - Mvpsl2 * `VD` - Dental * `VV` - Vision * `ICHRA` - Ichra * `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus * `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only - `"EBA"` - `"VPC"` - `"VPC_CORE"` - `"MEC"` - `"MEC2"` - `"MEC_PLUS"` - `"MVP"` - `"MVP2"` - `"MVPSL"` - `"MVPSL2"` - `"VD"` - `"VV"` - `"ICHRA"` - `"ICHRA_PREMIUM_PLUS"` - `"ICHRA_REIMBURSEMENT_ONLY"` - `product_name: string` Display name of the benefit product - `requires_qle_for_reissue: boolean` Whether a qualifying life event would be required to reissue this enrollment under the product and open-enrollment rule at the time this list was read - `carrier_name?: string | null` Insurance carrier name; null when no active carrier period is resolvable - `coverage_end?: string | null` Coverage window end date (YYYY-MM-DD); null while coverage is open-ended - `coverage_start?: string | null` Coverage window start date (YYYY-MM-DD) - `employee_deduction_in_cents?: number | null` Employee monthly payroll deduction in cents; null unless the row is an election - `employer_contribution_in_cents?: number | null` Employer monthly contribution in cents; null unless the row is an election - `enrollment_window_end?: string | null` Enrollment / open-enrollment window end date (YYYY-MM-DD); null when open-ended - `plan_name?: string | null` Chosen benefit plan name; null unless the row is an election - `premium_in_cents?: number | null` Total monthly plan premium in cents; null unless the row is an election - `tier_name?: string | null` Chosen benefit plan tier name (e.g., Employee Only); null unless the row is an election ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); const response = await client.members.listEnrollments('mbr_abc123def456'); console.log(response.data); ``` #### Response ```json { "data": [ { "id": "enrl_AAAAAAAAAAAAAAAAAAAAAQ", "employer_id": "empr_AAAAAAAAAAAAAAAAAAAAAQ", "benefit_plan_year_id": "plyr_AAAAAAAAAAAAAAAAAAAAAQ", "benefit_type": "Medical", "product_code": "MEC_PLUS", "requires_qle_for_reissue": false, "product_name": "MEC Plus", "employer_name": "Acme Corp", "carrier_name": "Vitable", "plan_name": "MEC Plus Standard", "tier_name": "Employee Only", "employee_deduction_in_cents": 5000, "employer_contribution_in_cents": 25000, "premium_in_cents": 30000, "coverage_start": "2026-04-01", "coverage_end": "2026-08-31", "cancelled_date": null, "plan_year_coverage_end": "2026-12-31", "enrollment_window_start": "2026-03-01", "enrollment_window_end": "2026-03-31", "election_status": "Enrolled", "policy_status": "Coverage Effective", "in_last_month_of_coverage": true, "is_within_enrollment_window": false }, { "id": "enrl_AAAAAAAAAAAAAAAAAAAAAg", "employer_id": "empr_AAAAAAAAAAAAAAAAAAAAAg", "benefit_plan_year_id": "plyr_AAAAAAAAAAAAAAAAAAAAAg", "benefit_type": "Dental", "product_code": "VD", "requires_qle_for_reissue": true, "product_name": "Vitable Dental", "employer_name": "Acme Corp", "carrier_name": "Vitable", "plan_name": null, "tier_name": null, "employee_deduction_in_cents": null, "employer_contribution_in_cents": null, "premium_in_cents": null, "coverage_start": null, "coverage_end": null, "cancelled_date": null, "plan_year_coverage_end": "2026-12-31", "enrollment_window_start": "2026-03-01", "enrollment_window_end": "2026-03-31", "election_status": "Waived", "policy_status": null, "in_last_month_of_coverage": false, "is_within_enrollment_window": false }, { "id": "enrl_AAAAAAAAAAAAAAAAAAAAAw", "benefit_type": "Dental", "product_code": "VD", "requires_qle_for_reissue": true, "product_name": "Vitable Dental", "employer_name": "Acme Corp", "carrier_name": "Vitable", "plan_name": "Vitable Dental Standard", "tier_name": "Employee Only", "employee_deduction_in_cents": 1200, "employer_contribution_in_cents": 800, "premium_in_cents": 2000, "coverage_start": null, "coverage_end": null, "cancelled_date": "2026-03-15", "plan_year_coverage_end": "2026-12-31", "enrollment_window_start": "2026-03-01", "enrollment_window_end": "2026-03-31", "election_status": "Enrolled", "policy_status": "Cancelled", "in_last_month_of_coverage": false, "is_within_enrollment_window": false } ] } ``` ## Get member household `client.members.retrieveHousehold(stringmemberID, RequestOptionsoptions?): MemberRetrieveHouseholdResponse` **get** `/v1/members/{member_id}/household` Lists a member's household as a per-participant table — the account holder plus each active household member, with name, relationship, member type, date of birth, and household-admin flag. Access is scoped to the authenticated principal; a member not visible to the caller (or with no household) returns a 404. ### Parameters - `memberID: string` Unique member identifier (mbr_*) ### Returns - `MemberRetrieveHouseholdResponse` Unpaginated `{"data": [...]}` list of the members of a member's household. - `data: Array` - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `first_name: string` Household member's first name - `household_admin_in: boolean` Whether this participant is a household admin (the account holder always is) - `last_name: string` Household member's last name - `member_id: string` Member identifier with 'mbr_' prefix - `member_type: "Account Holder" | "Dependent" | "Inactive"` * `Account Holder` - Account Holder * `Dependent` - Dependent * `Inactive` - Inactive - `"Account Holder"` - `"Dependent"` - `"Inactive"` - `relationship?: "Child" | "Spouse" | "Roommate" | "Other" | null` * `Child` - Child * `Spouse` - Spouse * `Roommate` - Roommate * `Other` - Other - `"Child"` - `"Spouse"` - `"Roommate"` - `"Other"` ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); const response = await client.members.retrieveHousehold('mbr_abc123def456'); console.log(response.data); ``` #### Response ```json { "data": [ { "member_id": "mbr_abc123def456", "name": "Jane Doe", "relationship": null, "member_type": "Account Holder", "date_of_birth": "1990-04-12", "household_admin_in": true }, { "member_id": "mbr_def456abc789", "name": "John Doe", "relationship": "Spouse", "member_type": "Household Dependent", "date_of_birth": "1989-02-03", "household_admin_in": false } ] } ``` ## List member ID cards `client.members.listIDCards(stringmemberID, RequestOptionsoptions?): MemberListIDCardsResponse` **get** `/v1/members/{member_id}/id-cards` Lists a member's benefit ID cards — card type (medical, dental, vision, or rx), employer, plan, provider network, claims payer, carrier contact details, and the disclaimers printed on the card. Medical, dental and vision cards come from the member's active digital benefit cards; the rx card from the member's Ventegra pharmacy benefit (omitted when the member has no free-medication coverage), which carries no plan, network, or carrier details. Access is scoped to the authenticated principal, and an organization caller sees only cards from employers in its book; a member not visible to the caller returns a 404. ### Parameters - `memberID: string` Unique member identifier (mbr_*) ### Returns - `MemberListIDCardsResponse` Unpaginated `{"data": [...]}` list of member digital benefit cards. - `data: Array` - `card_type: "medical" | "dental" | "vision" | "rx"` * `medical` - medical * `dental` - dental * `vision` - vision * `rx` - rx - `"medical"` - `"dental"` - `"vision"` - `"rx"` - `group_id: string` Group number printed on the card (the rx group id for an rx card) - `group_member_id: string` Member id printed on the card (the Ventegra cardholder id for an rx card) - `member_name: string` Name of the member the card is issued to - `nsa_table: Array>` No Surprises Act cost-sharing table rendered on the card; empty for an rx card - `benefit_code?: "EBA" | "VPC" | "VPC_CORE" | 12 more | null` * `EBA` - Eba Mec * `VPC` - Vpc Enhanced * `VPC_CORE` - Vpc Core * `MEC` - Vpc Mec * `MEC2` - Mec2 * `MEC_PLUS` - Mec Plus * `MVP` - Mvp * `MVP2` - Mvp2 * `MVPSL` - Mvpsl * `MVPSL2` - Mvpsl2 * `VD` - Dental * `VV` - Vision * `ICHRA` - Ichra * `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus * `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only - `"EBA"` - `"VPC"` - `"VPC_CORE"` - `"MEC"` - `"MEC2"` - `"MEC_PLUS"` - `"MVP"` - `"MVP2"` - `"MVPSL"` - `"MVPSL2"` - `"VD"` - `"VV"` - `"ICHRA"` - `"ICHRA_PREMIUM_PLUS"` - `"ICHRA_REIMBURSEMENT_ONLY"` - `carrier_phone?: string | null` Carrier phone number on the card; null for an rx card - `carrier_website?: string | null` Carrier website on the card; null for an rx card - `claims_payer_display_name?: string | null` Claims payer shown on the card - `employer_name?: string | null` Employer the card's coverage is through; null for an rx card without group info - `general_disclaimer?: string | null` General disclaimer text; null for an rx card - `network?: Network | null` Provider network shown on the card; null for an rx card - `id: string` - `address: Address` Shared read serializer for a postal address on public API responses. One definition for the address block every public resource emits (employer, employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it renders an already-built address value object (e.g. `AddressDVO`) whose attributes map 1:1 to these fields. - `address_line_1: string` Primary street address. - `address_line_2: string | null` Secondary street address (apt, suite, etc.). - `city: string` City name. - `state: string` Two-letter state code (e.g. `CA`, `NY`). - `zipcode: string` ZIP code (5 or 9 digit). - `logo: string | null` - `member_phone: string | null` - `name: string` Name of the network - `phone: string` - `provider_phone: string | null` - `website: string` Website of the network - `edi?: string | null` Network's EDI - `member_website?: string | null` Website for members - `provider_website?: string | null` Website for providers - `plan_disclaimer?: string | null` Plan-specific disclaimer text; null for an rx card - `plan_name?: string | null` Benefit plan name on the card; null for a consumer-membership rx card ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); const response = await client.members.listIDCards('mbr_abc123def456'); console.log(response.data); ``` #### Response ```json { "data": [ { "card_type": "medical", "group_id": "GRP-000123", "group_member_id": "GM-000456", "member_name": "Jane Doe", "employer_name": "Acme Inc.", "plan_name": "MEC Plus Standard", "benefit_code": "MEC_PLUS", "network": { "id": "5f1c1f9e-6d4a-4b21-9f77-2d4c8f0a1b33", "name": "First Health", "logo": "https://assets.vitablehealth.com/networks/first-health.png", "address": { "address_line_1": "123 Main Street", "address_line_2": null, "city": "San Francisco", "state": "CA", "zipcode": "94102" }, "edi": "87726", "website": "https://firsthealth.example.com", "phone": "(800) 555-0100", "member_website": "https://firsthealth.example.com/members", "member_phone": "(800) 555-0101", "provider_website": "https://firsthealth.example.com/providers", "provider_phone": "(800) 555-0102" }, "claims_payer_display_name": "Vitable Health", "carrier_phone": "(800) 555-0100", "carrier_website": "https://vitablehealth.com", "plan_disclaimer": "This plan is not major medical insurance.", "general_disclaimer": "Possession of this card does not guarantee coverage.", "nsa_table": [ [ "Primary care", "$0" ], [ "Specialist", "$40" ] ] }, { "card_type": "rx", "group_id": "TEST125", "group_member_id": "RX-000789", "member_name": "Jane Doe", "employer_name": "Acme Inc.", "plan_name": null, "benefit_code": null, "network": null, "claims_payer_display_name": null, "carrier_phone": null, "carrier_website": null, "plan_disclaimer": null, "general_disclaimer": null, "nsa_table": [] } ] } ``` ## List member qualifying life events `client.members.listQualifyingLifeEvents(stringmemberID, MemberListQualifyingLifeEventsParamsquery?, RequestOptionsoptions?): PageNumberPage` **get** `/v1/members/{member_id}/qualifying-life-events` Lists a member's qualifying life events, including events already used for another enrollment. Returns all statuses by default; pass the status query param to filter to one (e.g. approved). Events are ordered newest submission first with stable paging. Custom text is present only when submitted and is otherwise null. A member not visible to the caller returns a 404. API keys and unbound access tokens have organization-wide access. Employer-bound tokens require employment at the bound employer, and employee-bound tokens require the exact employee-member relationship. Organization or scope mismatches return a 404 before pagination is validated. ### Parameters - `memberID: string` Unique member identifier (mbr_*) - `query: MemberListQualifyingLifeEventsParams` - `limit?: number` Items per page (default: 20, max: 100) - `page?: number` Page number (default: 1) - `status?: "approved" | "denied" | "pending"` Optional. Filter to a single QLE status; omit to return all statuses. - `"approved"` - `"denied"` - `"pending"` ### Returns - `MemberListQualifyingLifeEventsResponse` - `id: string` Opaque qualifying life event identifier - `event_type: "Married" | "Divorced" | "New child" | 2 more` * `Married` - Married * `Divorced` - Divorced * `New child` - New Child * `Court ordered` - Court Ordered * `Other` - Other - `"Married"` - `"Divorced"` - `"New child"` - `"Court ordered"` - `"Other"` - `other_event: string | null` Custom event description when event_type is Other; otherwise normally null - `status: "pending" | "approved" | "denied"` * `pending` - Pending * `approved` - Approved * `denied` - Denied - `"pending"` - `"approved"` - `"denied"` - `submitted_at: string` When the member submitted the event ### Example ```typescript import VitableConnect from '@vitable-inc/vitable-connect'; const client = new VitableConnect({ apiKey: process.env['VITABLE_CONNECT_API_KEY'], // This is the default and can be omitted }); // Automatically fetches more pages as needed. for await (const memberListQualifyingLifeEventsResponse of client.members.listQualifyingLifeEvents( 'mbr_abc123def456', )) { console.log(memberListQualifyingLifeEventsResponse.id); } ``` #### Response ```json { "data": [ { "id": "qle_AAAAAAAAAAAAAAAAAAAAAQ", "event_type": "Other", "other_event": "Relocation", "status": "approved", "submitted_at": "2026-07-01T14:30:00Z" } ], "pagination": { "page": 1, "limit": 20, "total": 1, "total_pages": 1 } } ``` ## Domain Types ### Member List Response - `MemberListResponse` A member in the organization's directory: identity, contact details, address, and join date. - `id: string` Unique member identifier with 'mbr_' prefix - `first_name: string` Member's legal first name - `last_name: string` Member's legal last name - `address?: Address | null` Member's residential address - `address_line_1: string` Primary street address - `city: string` City name - `state: "AL" | "AK" | "AZ" | 59 more` * `AL` - AL * `AK` - AK * `AZ` - AZ * `AR` - AR * `CA` - CA * `CO` - CO * `CT` - CT * `DC` - DC * `DE` - DE * `FL` - FL * `GA` - GA * `HI` - HI * `ID` - ID * `IL` - IL * `IN` - IN * `IA` - IA * `KS` - KS * `KY` - KY * `LA` - LA * `ME` - ME * `MD` - MD * `MA` - MA * `MI` - MI * `MN` - MN * `MS` - MS * `MO` - MO * `MT` - MT * `NE` - NE * `NV` - NV * `NH` - NH * `NJ` - NJ * `NM` - NM * `NY` - NY * `NC` - NC * `ND` - ND * `OH` - OH * `OK` - OK * `OR` - OR * `PA` - PA * `RI` - RI * `SC` - SC * `SD` - SD * `TN` - TN * `TX` - TX * `UT` - UT * `VT` - VT * `VA` - VA * `WA` - WA * `WI` - WI * `WV` - WV * `WY` - WY * `PR` - PR * `GU` - GU * `AS` - AS * `VI` - VI * `MP` - MP * `MH` - MH * `PW` - PW * `FM` - FM * `AE` - AE * `AA` - AA * `AP` - AP - `"AL"` - `"AK"` - `"AZ"` - `"AR"` - `"CA"` - `"CO"` - `"CT"` - `"DC"` - `"DE"` - `"FL"` - `"GA"` - `"HI"` - `"ID"` - `"IL"` - `"IN"` - `"IA"` - `"KS"` - `"KY"` - `"LA"` - `"ME"` - `"MD"` - `"MA"` - `"MI"` - `"MN"` - `"MS"` - `"MO"` - `"MT"` - `"NE"` - `"NV"` - `"NH"` - `"NJ"` - `"NM"` - `"NY"` - `"NC"` - `"ND"` - `"OH"` - `"OK"` - `"OR"` - `"PA"` - `"RI"` - `"SC"` - `"SD"` - `"TN"` - `"TX"` - `"UT"` - `"VT"` - `"VA"` - `"WA"` - `"WI"` - `"WV"` - `"WY"` - `"PR"` - `"GU"` - `"AS"` - `"VI"` - `"MP"` - `"MH"` - `"PW"` - `"FM"` - `"AE"` - `"AA"` - `"AP"` - `zipcode: string` ZIP code (5 or 9 digit) - `address_line_2?: string | null` Secondary street address (apt, suite, etc.) - `email?: string | null` Email address - `phone?: string | null` Phone number (10-digit US domestic string) ### Member Retrieve Response - `MemberRetrieveResponse` Response containing a single member resource. - `data: Data` A member's profile: identity, contact details, address, demographics, and onboarding status. - `id: string` Unique member identifier with 'mbr_' prefix - `age: number` Member's age in years, derived from date of birth - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `first_name: string` Member's legal first name - `last_name: string` Member's legal last name - `name: string` Member's full legal name - `status: "onboarded" | "pending_onboarding"` Member profile status (onboarded or pending onboarding) - `"onboarded"` - `"pending_onboarding"` - `address?: Address | null` Member's residential address - `address_line_1: string` Primary street address - `city: string` City name - `state: "AL" | "AK" | "AZ" | 59 more` * `AL` - AL * `AK` - AK * `AZ` - AZ * `AR` - AR * `CA` - CA * `CO` - CO * `CT` - CT * `DC` - DC * `DE` - DE * `FL` - FL * `GA` - GA * `HI` - HI * `ID` - ID * `IL` - IL * `IN` - IN * `IA` - IA * `KS` - KS * `KY` - KY * `LA` - LA * `ME` - ME * `MD` - MD * `MA` - MA * `MI` - MI * `MN` - MN * `MS` - MS * `MO` - MO * `MT` - MT * `NE` - NE * `NV` - NV * `NH` - NH * `NJ` - NJ * `NM` - NM * `NY` - NY * `NC` - NC * `ND` - ND * `OH` - OH * `OK` - OK * `OR` - OR * `PA` - PA * `RI` - RI * `SC` - SC * `SD` - SD * `TN` - TN * `TX` - TX * `UT` - UT * `VT` - VT * `VA` - VA * `WA` - WA * `WI` - WI * `WV` - WV * `WY` - WY * `PR` - PR * `GU` - GU * `AS` - AS * `VI` - VI * `MP` - MP * `MH` - MH * `PW` - PW * `FM` - FM * `AE` - AE * `AA` - AA * `AP` - AP - `"AL"` - `"AK"` - `"AZ"` - `"AR"` - `"CA"` - `"CO"` - `"CT"` - `"DC"` - `"DE"` - `"FL"` - `"GA"` - `"HI"` - `"ID"` - `"IL"` - `"IN"` - `"IA"` - `"KS"` - `"KY"` - `"LA"` - `"ME"` - `"MD"` - `"MA"` - `"MI"` - `"MN"` - `"MS"` - `"MO"` - `"MT"` - `"NE"` - `"NV"` - `"NH"` - `"NJ"` - `"NM"` - `"NY"` - `"NC"` - `"ND"` - `"OH"` - `"OK"` - `"OR"` - `"PA"` - `"RI"` - `"SC"` - `"SD"` - `"TN"` - `"TX"` - `"UT"` - `"VT"` - `"VA"` - `"WA"` - `"WI"` - `"WV"` - `"WY"` - `"PR"` - `"GU"` - `"AS"` - `"VI"` - `"MP"` - `"MH"` - `"PW"` - `"FM"` - `"AE"` - `"AA"` - `"AP"` - `zipcode: string` ZIP code (5 or 9 digit) - `address_line_2?: string | null` Secondary street address (apt, suite, etc.) - `email?: string | null` Email address - `gender?: "Male" | "Female" | "Transgender" | 2 more | null` * `Male` - Male * `Female` - Female * `Transgender` - Transgender * `Non-binary` - Non Binary * `Prefer not to respond` - Prefer Not To Respond - `"Male"` - `"Female"` - `"Transgender"` - `"Non-binary"` - `"Prefer not to respond"` - `marital_status?: "Single" | "Married" | null` * `Single` - Single * `Married` - Married - `"Single"` - `"Married"` - `middle_name?: string | null` Member's legal middle name - `phone?: string | null` Phone number (10-digit US domestic string) - `preferred_language?: "en" | "es" | "zh" | 3 more | null` * `en` - English * `es` - Spanish * `zh` - Chinese * `ru` - Russian * `sw` - Swahili * `th` - Thai - `"en"` - `"es"` - `"zh"` - `"ru"` - `"sw"` - `"th"` - `sex_at_birth?: "Male" | "Female" | "Other" | "Unknown" | null` * `Male` - Male * `Female` - Female * `Other` - Other * `Unknown` - Unknown - `"Male"` - `"Female"` - `"Other"` - `"Unknown"` - `suffix?: "Sr" | "Jr" | "I" | 4 more | null` * `Sr` - Sr * `Jr` - Jr * `I` - I * `II` - II * `III` - III * `IV` - IV * `V` - V - `"Sr"` - `"Jr"` - `"I"` - `"II"` - `"III"` - `"IV"` - `"V"` - `tobacco_status?: boolean | null` Whether the member uses tobacco, if known ### Member List Dependents Response - `MemberListDependentsResponse` Unpaginated `{"data": [...]}` list of member dependents. - `data: Array` - `age: number` Dependent's age in years, derived from date of birth - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `first_name: string` Dependent's first name - `last_name: string` Dependent's last name - `member_id: string` The dependent's own member identifier with 'mbr_' prefix - `primary_member_id: string` The primary member's identifier with 'mbr_' prefix - `relationship: "Spouse" | "Child"` * `Spouse` - Spouse * `Child` - Child - `"Spouse"` - `"Child"` - `sex_at_birth?: "Male" | "Female" | "Other" | "Unknown" | null` * `Male` - Male * `Female` - Female * `Other` - Other * `Unknown` - Unknown - `"Male"` - `"Female"` - `"Other"` - `"Unknown"` ### Member List Employments Response - `MemberListEmploymentsResponse` Unpaginated `{"data": [...]}` list of member employments. - `data: Array` - `id: string` Unique employee identifier with 'empl_' prefix - `classification_effective_date: string` Date the employee's current classification took effect - `compensation_type: "Salary" | "Hourly" | null` * `Salary` - Salary * `Hourly` - Hourly - `"Salary"` - `"Hourly"` - `compensation_type_effective_date: string` Date the employee's current compensation type took effect - `created_at: string` Timestamp when the employee was created - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `deductions: Array` Payroll deductions from the most recent statement period. Replaced when a new statement is generated. - `benefit_name: string` Name of the benefit plan - `deduction_amount_in_cents: number` Employee deduction amount in cents - `deduction_category: string | null` Deduction category (reserved for future use) - `frequency: "weekly" | "bi_weekly" | "semi_monthly" | "monthly"` * `weekly` - Weekly * `bi_weekly` - Bi Weekly * `semi_monthly` - Semi Monthly * `monthly` - Monthly - `"weekly"` - `"bi_weekly"` - `"semi_monthly"` - `"monthly"` - `period_end_date: string` Period end date (YYYY-MM-DD) - `period_start_date: string` Period start date (YYYY-MM-DD) - `tax_classification: "Unknown" | "Pre-tax" | "Post-tax"` * `Unknown` - Unknown * `Pre-tax` - Pre Tax * `Post-tax` - Post Tax - `"Unknown"` - `"Pre-tax"` - `"Post-tax"` - `email: string` Email address - `employee_class: EmployeeClass` * `Full Time` - Full Time * `Part Time` - Part Time * `Temporary` - Temporary * `Intern` - Intern * `Seasonal` - Seasonal * `Individual Contractor` - Individual Contractor - `"Full Time"` - `"Part Time"` - `"Temporary"` - `"Intern"` - `"Seasonal"` - `"Individual Contractor"` - `employer_id: string` Unique identifier of the employer this employment is with (empr_*) - `first_name: string` Employee's legal first name - `last_name: string` Employee's legal last name - `member_id: string` Unique member identifier with 'mbr_' prefix - `phone: string | null` Phone number (10-digit US domestic string) - `start_date: string` Employee's start date with the employer - `status: "active" | "terminated"` Employee status (active or terminated) - `"active"` - `"terminated"` - `updated_at: string` Timestamp when the employee was last updated - `address?: Address | null` Employee's residential address - `address_line_1: string` Primary street address - `city: string` City name - `state: string` Two-letter state code (e.g., CA, NY) - `zipcode: string` ZIP code (5 or 9 digit) - `address_line_2?: string | null` Secondary street address (apt, suite, etc.) - `employer_name?: string | null` Name of the employer this employment is with - `gender?: string | null` Gender identity, if provided - `reference_id?: string | null` Partner-assigned reference ID for the employee - `suffix?: string | null` Name suffix (e.g., Jr., Sr., III) - `termination_date?: string | null` Employee's termination date, if terminated ### Member List Enrollments Response - `MemberListEnrollmentsResponse` Unpaginated `{"data": [...]}` list of member enrollments. - `data: Array` - `id: string` Opaque, stable enrollment identifier used to target enrollment actions - `benefit_plan_year_id: string` Exact benefit plan-year identifier for this enrollment - `benefit_type: "Medical" | "Dental" | "Vision" | "Hospital"` * `Medical` - Medical * `Dental` - Dental * `Vision` - Vision * `Hospital` - Hospital - `"Medical"` - `"Dental"` - `"Vision"` - `"Hospital"` - `cancelled_date: string | null` Earliest applicable coverage boundary (YYYY-MM-DD) when coverage was cancelled before its effective start; null unless the enrollment was cancelled - `election_status: "Enrolled" | "Waived" | "Pending" | "Expired"` * `Enrolled` - Enrolled * `Waived` - Waived * `Pending` - Pending * `Expired` - Expired - `"Enrolled"` - `"Waived"` - `"Pending"` - `"Expired"` - `employer_id: string` Exact employer identifier for this enrollment - `employer_name: string` Name of the employer the enrollment is through - `enrollment_window_start: string` Enrollment / open-enrollment window start date (YYYY-MM-DD) - `in_last_month_of_coverage: boolean` True when today falls in the final month of the plan-year coverage window; drives end-of-coverage enrollment actions on the client. - `is_within_enrollment_window: boolean` True when today falls inside the enrollment window this member has to answer in; drives enrollment-action availability on the client. - `plan_year_coverage_end: string | null` Benefit plan-year coverage end date (YYYY-MM-DD), distinct from this enrollment's coverage_end; null when the plan year is open-ended - `policy_status: "Coverage Upcoming" | "Coverage Effective" | "Coverage Ended" | "Cancelled" | null` * `Coverage Upcoming` - Coverage Upcoming * `Coverage Effective` - Coverage Effective * `Coverage Ended` - Coverage Ended * `Cancelled` - Cancelled - `"Coverage Upcoming"` - `"Coverage Effective"` - `"Coverage Ended"` - `"Cancelled"` - `product_code: "EBA" | "VPC" | "VPC_CORE" | 12 more` * `EBA` - Eba Mec * `VPC` - Vpc Enhanced * `VPC_CORE` - Vpc Core * `MEC` - Vpc Mec * `MEC2` - Mec2 * `MEC_PLUS` - Mec Plus * `MVP` - Mvp * `MVP2` - Mvp2 * `MVPSL` - Mvpsl * `MVPSL2` - Mvpsl2 * `VD` - Dental * `VV` - Vision * `ICHRA` - Ichra * `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus * `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only - `"EBA"` - `"VPC"` - `"VPC_CORE"` - `"MEC"` - `"MEC2"` - `"MEC_PLUS"` - `"MVP"` - `"MVP2"` - `"MVPSL"` - `"MVPSL2"` - `"VD"` - `"VV"` - `"ICHRA"` - `"ICHRA_PREMIUM_PLUS"` - `"ICHRA_REIMBURSEMENT_ONLY"` - `product_name: string` Display name of the benefit product - `requires_qle_for_reissue: boolean` Whether a qualifying life event would be required to reissue this enrollment under the product and open-enrollment rule at the time this list was read - `carrier_name?: string | null` Insurance carrier name; null when no active carrier period is resolvable - `coverage_end?: string | null` Coverage window end date (YYYY-MM-DD); null while coverage is open-ended - `coverage_start?: string | null` Coverage window start date (YYYY-MM-DD) - `employee_deduction_in_cents?: number | null` Employee monthly payroll deduction in cents; null unless the row is an election - `employer_contribution_in_cents?: number | null` Employer monthly contribution in cents; null unless the row is an election - `enrollment_window_end?: string | null` Enrollment / open-enrollment window end date (YYYY-MM-DD); null when open-ended - `plan_name?: string | null` Chosen benefit plan name; null unless the row is an election - `premium_in_cents?: number | null` Total monthly plan premium in cents; null unless the row is an election - `tier_name?: string | null` Chosen benefit plan tier name (e.g., Employee Only); null unless the row is an election ### Member Retrieve Household Response - `MemberRetrieveHouseholdResponse` Unpaginated `{"data": [...]}` list of the members of a member's household. - `data: Array` - `date_of_birth: string` Date of birth (YYYY-MM-DD) - `first_name: string` Household member's first name - `household_admin_in: boolean` Whether this participant is a household admin (the account holder always is) - `last_name: string` Household member's last name - `member_id: string` Member identifier with 'mbr_' prefix - `member_type: "Account Holder" | "Dependent" | "Inactive"` * `Account Holder` - Account Holder * `Dependent` - Dependent * `Inactive` - Inactive - `"Account Holder"` - `"Dependent"` - `"Inactive"` - `relationship?: "Child" | "Spouse" | "Roommate" | "Other" | null` * `Child` - Child * `Spouse` - Spouse * `Roommate` - Roommate * `Other` - Other - `"Child"` - `"Spouse"` - `"Roommate"` - `"Other"` ### Member List ID Cards Response - `MemberListIDCardsResponse` Unpaginated `{"data": [...]}` list of member digital benefit cards. - `data: Array` - `card_type: "medical" | "dental" | "vision" | "rx"` * `medical` - medical * `dental` - dental * `vision` - vision * `rx` - rx - `"medical"` - `"dental"` - `"vision"` - `"rx"` - `group_id: string` Group number printed on the card (the rx group id for an rx card) - `group_member_id: string` Member id printed on the card (the Ventegra cardholder id for an rx card) - `member_name: string` Name of the member the card is issued to - `nsa_table: Array>` No Surprises Act cost-sharing table rendered on the card; empty for an rx card - `benefit_code?: "EBA" | "VPC" | "VPC_CORE" | 12 more | null` * `EBA` - Eba Mec * `VPC` - Vpc Enhanced * `VPC_CORE` - Vpc Core * `MEC` - Vpc Mec * `MEC2` - Mec2 * `MEC_PLUS` - Mec Plus * `MVP` - Mvp * `MVP2` - Mvp2 * `MVPSL` - Mvpsl * `MVPSL2` - Mvpsl2 * `VD` - Dental * `VV` - Vision * `ICHRA` - Ichra * `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus * `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only - `"EBA"` - `"VPC"` - `"VPC_CORE"` - `"MEC"` - `"MEC2"` - `"MEC_PLUS"` - `"MVP"` - `"MVP2"` - `"MVPSL"` - `"MVPSL2"` - `"VD"` - `"VV"` - `"ICHRA"` - `"ICHRA_PREMIUM_PLUS"` - `"ICHRA_REIMBURSEMENT_ONLY"` - `carrier_phone?: string | null` Carrier phone number on the card; null for an rx card - `carrier_website?: string | null` Carrier website on the card; null for an rx card - `claims_payer_display_name?: string | null` Claims payer shown on the card - `employer_name?: string | null` Employer the card's coverage is through; null for an rx card without group info - `general_disclaimer?: string | null` General disclaimer text; null for an rx card - `network?: Network | null` Provider network shown on the card; null for an rx card - `id: string` - `address: Address` Shared read serializer for a postal address on public API responses. One definition for the address block every public resource emits (employer, employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it renders an already-built address value object (e.g. `AddressDVO`) whose attributes map 1:1 to these fields. - `address_line_1: string` Primary street address. - `address_line_2: string | null` Secondary street address (apt, suite, etc.). - `city: string` City name. - `state: string` Two-letter state code (e.g. `CA`, `NY`). - `zipcode: string` ZIP code (5 or 9 digit). - `logo: string | null` - `member_phone: string | null` - `name: string` Name of the network - `phone: string` - `provider_phone: string | null` - `website: string` Website of the network - `edi?: string | null` Network's EDI - `member_website?: string | null` Website for members - `provider_website?: string | null` Website for providers - `plan_disclaimer?: string | null` Plan-specific disclaimer text; null for an rx card - `plan_name?: string | null` Benefit plan name on the card; null for a consumer-membership rx card ### Member List Qualifying Life Events Response - `MemberListQualifyingLifeEventsResponse` - `id: string` Opaque qualifying life event identifier - `event_type: "Married" | "Divorced" | "New child" | 2 more` * `Married` - Married * `Divorced` - Divorced * `New child` - New Child * `Court ordered` - Court Ordered * `Other` - Other - `"Married"` - `"Divorced"` - `"New child"` - `"Court ordered"` - `"Other"` - `other_event: string | null` Custom event description when event_type is Other; otherwise normally null - `status: "pending" | "approved" | "denied"` * `pending` - Pending * `approved` - Approved * `denied` - Denied - `"pending"` - `"approved"` - `"denied"` - `submitted_at: string` When the member submitted the event