---
title: "Create an enrollment"
method: POST
path: "/groups/{groupId}/enrollments"
tags: ["Enrollments"]
---

# Create an enrollment

`POST /groups/{groupId}/enrollments`

Locks the employer's plan selection against a quote. Requires an unexpired `ready` quote and an enrollment-ready census: every active member needs `firstName`, `lastName`, and `email` (failures come back as `invalid_request` with per-member details). Prescience provisions the company (state `sandbox`), materializes the census, and starts the onboarding pipeline. On the hosted pathway (default) the signatory is also provisioned as an employer portal admin and receives a set-password invite; in test mode the invite email is suppressed (`employerPortal.inviteSuppressed: true`). Fires the `enrollment.created` webhook.

## Path parameters

- `groupId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- EnrollmentCreateRequest
  - `quoteId` string, required
  - `startDate` string, date — Defaults to the quote's `planYearStartDate`.
  - `onboardingMode` 'hosted' | 'embedded' — How post-enrollment onboarding runs. `hosted` (default): Prescience provisions the signatory as an employer portal admin and runs onboarding, KYB, banking, and plan setup in the Prescience employer portal; track progress via `GET /groups/{groupId}/enrollments/{enrollmentId}` or webhooks. `embedded`: onboarding rendered in your own UI when enabled for the integration.
  - `signatory` object, required — The employer admin who selected the plan. On the hosted pathway, provisioned as the company's admin in the Prescience employer portal.
    - `name` string, required
    - `email` string, email, required
    - `title` string

## Response `201`

Enrollment created. The group status moves to `enrolled`.

- Enrollment
  - `id` string, required
  - `groupId` string, required
  - `mode` 'test' | 'live', required
  - `status` 'onboarding' | 'active', required — `active` once Prescience flips the company to `prod`.
  - `quoteId` string, required
  - `startDate` string, date, required
  - `companyDomain` string, required
  - `companyState` 'sandbox' | 'prod', required
  - `onboardingMode` 'hosted' | 'embedded', required — How post-enrollment onboarding runs. Stamped at creation; defaults to `hosted`.
  - `employerPortal` object — Provisioning summary for the signatory's employer portal account. Present whenever the signatory was provisioned as an employer portal admin (always on the hosted pathway).
    - `provisioned` boolean, required — Whether the portal account was provisioned. `false` indicates a provisioning failure; the enrollment itself stands and Prescience follows up.
    - `signinUrl` string, uri, required
    - `inviteSuppressed` boolean, required — `true` when the invite email was not sent. Always `true` in test mode: test mode never sends outbound email.
  - `onboarding` object, required — Recomputed from the live onboarding checklist on every read.
    - `percentComplete` integer
    - `blockingRemaining` integer
  - `nextSteps` string[], required
  - `createdAt` string, date-time, required

## Other responses

- `400` — Census not enrollment-ready. One detail entry per failing member.
- `401` — Missing, malformed, or revoked API key.
- `404` — No such resource in this mode. Test keys only see test resources; live keys only see live resources.
- `409` — Conflict: the group already has an active enrollment, an enrolled group already exists for this domain, or the quote is still `in_review`.
- `410` — The quote has expired (default 30-day window). Create a new quote and retry.
- `429` — Rate limit exceeded. Honor `Retry-After`.
- `500` — Something failed on our side. Safe to retry with the same `Idempotency-Key`.

---

[API](https://skmtc.dev/getprescience/apis/prescience-partner-api.md) · [All operations](https://skmtc.dev/getprescience/apis/prescience-partner-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/getprescience/prescience-partner-api/revisions/eb1f377f8139/schema)
