Skip to main content
The census is the input to everything: quotes are rated from it, enrollments materialize it into the live plan, and ongoing syncs keep it true. You already have all of this data; it’s your employee roster plus dependents. PUT /groups/{groupId}/census replaces the full census. Members are upserted by email when present, otherwise by externalId, so re-pushing your roster is always safe and idempotent.

Member schema

Limits: up to 10,000 members per census, 6 dependents per member.

Quoting vs enrollment requirements

Per member: zip + one of dob | age. That’s it.This is deliberate: you can generate a quote from the minimal data every HR system has, before asking anyone for names or emails. Dependent dobs sharpen the rating (a spouse without one is rated at the employee’s age; a child without one is rated as a 10-year-old), but they’re optional.

Per-row errors: bad rows never block good ones

A census write is row-by-row. Valid rows are stored; invalid rows are rejected and reported with their index. A 142-row upload with one bad ZIP stores 141 members:
  • errors: rows that were rejected. Fix and re-PUT; upserts make re-sending the clean rows harmless.
  • warnings: non-blocking issues, today chiefly members missing email. They quote fine but will fail enrollment.
Treat accepted < received as a sync alert in your integration, not a hard failure. The group can still be quoted with the accepted members.

Reading the census back

GET /groups/{groupId}/census returns what’s stored, each member with a server-assigned memberId:
Keep memberId mapped to your employee record; it’s the handle for single-member updates (PATCH /members/{memberId}) in census sync.
Census intake is enrollment and eligibility data. Before live mode, a BAA and data processing agreement are executed covering exactly this data. See Compliance.