Benefit enrollments
Enroll an Account in a benefit plan, read enrollments, and cancel or restore one with the V3 API.
A benefit enrollment records that an Account, or a Person on it, holds a benefit product such as health or dental cover. The list includes every benefit product the Account holds, whether or not Wingspan bills for it.
Prerequisites
benefits.enrollment:readto read andbenefits.enrollment:writeto create, change or cancel.payments.payroll-settings:readto list benefit plans.X-Wingspan-Accountset to the Account that enrolls.
Endpoints
| Purpose | Method and path |
|---|---|
| List benefit plans | GET /v3/platform/benefit-plans |
| Get a benefit plan | GET /v3/platform/benefit-plans/{planId} |
| Create an enrollment | POST /v3/platform/benefit-enrollments |
| List enrollments | GET /v3/platform/benefit-enrollments |
| Get an enrollment | GET /v3/platform/benefit-enrollments/{enrollmentId} |
| Update an enrollment | PATCH /v3/platform/benefit-enrollments/{enrollmentId} |
| Cancel an enrollment | POST /v3/platform/benefit-enrollments/{enrollmentId}/cancel |
| Withdraw a cancellation | POST /v3/platform/benefit-enrollments/{enrollmentId}/withdraw-cancellation |
Benefit plans
A benefit plan has id, name, description, type (Health, Dental, Vision, Life, Disability, Retirement or Other), provider, price, currency and interval (Monthly or Annual). A missing plan returns 404.
Enrollment status
An enrollment moves Created, Active, PendingCancellation, Cancelled.
| Field | Notes |
|---|---|
id, accountId, beneficiaryPersonId | |
productId, planId, subscriptionId, purchaseId | planId, subscriptionId and purchaseId are set when the catalog bills the product. |
status | As above. |
effectiveDate, terminationDate | Dates. |
dependents | firstName, lastName, dateOfBirth, relationship (Spouse, Child or DomesticPartner). |
events | createdAt, updatedAt, activatedAt, pendingCancellationAt, cancelledAt. |
actors | createdBy, cancelledBy. |
Create an enrollment
planId is required. effectiveDate, dependents and metadata are optional.
curl -X POST https://api.wingspan.app/v3/platform/benefit-enrollments \
-H "Authorization: Bearer $WINGSPAN_TOKEN" \
-H "X-Wingspan-Account: Nw7kQ2pLx9RtVb3mHc5dZa" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"planId": "Bq4nTx7KmW2cLd9vRh6YsE",
"effectiveDate": "2026-12-01",
"dependents": [
{ "firstName": "Sam", "lastName": "Rivera", "dateOfBirth": "2019-04-12", "relationship": "Child" }
]
}'The response is 201 with the enrollment. The values in the example are illustrative. Dependents are personal data: do not log them.
List enrollments
List enrollments returns the enrollments within your account scope. Filters: filter[status] with eq or anyOf, filter[productId] with eq or anyOf, and filter[accountIds] with eq or anyOf. Repeat anyOf[] to match several values. Sort on createdAt (default, newest first), updatedAt, effectiveDate or terminationDate.
curl -g "https://api.wingspan.app/v3/platform/benefit-enrollments?filter[status][anyOf][]=Active&filter[status][anyOf][]=PendingCancellation" \
-H "Authorization: Bearer $WINGSPAN_TOKEN" \
-H "X-Wingspan-Account: Nw7kQ2pLx9RtVb3mHc5dZa"Update, cancel and restore
Update an enrollment uses JSON Merge Patch on dependents and metadata. It does not cancel.
Cancel an enrollment takes no body. It moves your own Active enrollment to PendingCancellation. The product's own rules decide when cover ends, and the response returns it as terminationDate. Withdraw a cancellation reverses it before that date.
| Status | Cause |
|---|---|
404 | No enrollment with that ID in your scope. |
409 | A product whose cover ends through its provider, not through Wingspan, cannot be cancelled here. Also returned when you withdraw after terminationDate has passed and the enrollment is already Cancelled. |
422 | A field is invalid on create or update. |
Webhook events
BenefitEnrollment lifecycle events are published as webhooks. See Webhooks and events to subscribe.
Updated 12 minutes ago