> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.vitablehealth.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.vitablehealth.com/_mcp/server.

# Retrieve

GET https://api.vitablehealth.com/v1/enrollments/{enrollment_id}

Retrieves a single enrollment: the employee and employer it belongs to, the benefit product, its status, the coverage period, the employee payroll deduction and employer contribution, and the enrolled plan's Summary of Benefits and Coverage document when one is on file. An enrollment the caller cannot reach is indistinguishable from one that does not exist.

Reference: https://developer.vitablehealth.com/api/enrollments/get

## Authentication

- `Authorization` header (bearer token, required) — API Key or Access Token authentication using Bearer token in Authorization header. API keys use the vit_apk_ prefix, access tokens use the vit_at_ prefix.

## Servers

- `https://api.vitablehealth.com` (Production, default)
- `https://api.uat.vitablehealth.com` (UAT)

## Request

### Path parameters

- `enrollment_id` (string, required) — Unique enrollment identifier (enrl_*)

### Headers

- `X-Vitable-Organization` (string, optional) — Organization to act as for this request (e.g. `org_SGVsbG8gV29ybGQ`). Optional when your credentials reach a single organization. Required when they reach several — omitting it then returns 400 `organization_required`. A malformed value returns 400 `invalid_organization_header`, and naming an organization you do not have access to returns 403 `organization_access_denied`.

## Response

### 200

- `data` (EnrollmentDetail, required) — The enrollment, including its elected plans.

## Errors

### 400 Bad Request Error

Bad Request - Invalid input or validation error

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 401 Unauthorized Error

Unauthorized - Invalid or missing API key

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 403 Forbidden Error

Forbidden - Insufficient permissions for this resource

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 404 Not Found Error

Resource not found.

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 409 Conflict Error

Conflict - Resource already exists or conflicts with current state

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 429 Too Many Requests Error

Too Many Requests - Rate limit exceeded

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 500 Internal Server Error

Internal Server Error - An unexpected error occurred

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

### 502 Bad Gateway Error

Bad Gateway - External service error

- `timestamp` (datetime, required) — ISO 8601 timestamp when the error occurred
- `message` (string, required) — Human-readable error message
- `error` (string, required) — Error message (same as message, for backwards compatibility)
- `trace_id` (string, required) — Unique trace ID for debugging and support requests
- `app_error_code` (string, optional, nullable) — Application-specific error code for programmatic handling

## Types

### EnrollmentDetail

A single enrollment, including the enrolled plan's documents. The plan documents are resolved one enrollment at a time and are therefore not part of the list row.

- `id` (string, required) — Unique enrollment identifier (enrl_*)
- `employee_id` (string, required) — Employee ID (empl_*)
- `employer_id` (string, required) — Employer ID (empr_*)
- `benefit` (BenefitSummary, required) — Nested benefit product summary
- `status` (enum, required) — Enrollment status * `pending` - Pending * `enrolled` - Enrolled * `waived` - Waived * `inactive` - Inactive
  - Allowed values: `pending`, `enrolled`, `waived`, `inactive`
- `coverage_start` (date, required) — Coverage period start date
- `coverage_end` (date, required, nullable) — Coverage period end date
- `employee_deduction_in_cents` (integer, required, nullable) — Employee monthly payroll deduction in cents
- `employer_contribution_in_cents` (integer, required, nullable) — Employer monthly contribution in cents
- `answered_at` (datetime, required, nullable) — When the employee enrolled or waived
- `terminated_at` (datetime, required, nullable) — When coverage was terminated
- `created_at` (datetime, required) — When the enrollment was created
- `updated_at` (datetime, required) — When the enrollment was last updated
- `sbc_url` (string, optional, nullable) — Summary of Benefits and Coverage (SBC) document URL for the enrolled plan; null when not on file. Only individual (ICHRA) plans carry an SBC — group plans have no SBC on record and always resolve to null.

### BenefitSummary

- `id` (string, required) — Benefit product ID (bprd_*)
- `name` (string, required) — Display name of the benefit product
- `product_code` (enum, required) — Programmatic product identifier * `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
  - Allowed values: `EBA`, `VPC`, `VPC_CORE`, `MEC`, `MEC2`, `MEC_PLUS`, `MVP`, `MVP2`, `MVPSL`, `MVPSL2`, `VD`, `VV`, `ICHRA`, `ICHRA_PREMIUM_PLUS`, `ICHRA_REIMBURSEMENT_ONLY`
- `category` (enum, required) — High-level benefit grouping * `Medical` - Medical * `Dental` - Dental * `Vision` - Vision * `Hospital` - Hospital
  - Allowed values: `Medical`, `Dental`, `Vision`, `Hospital`

## Examples

**Response**

```json
{
  "data": {
    "id": "enrl_abc123def456",
    "employee_id": "empl_xyz789ghi012",
    "employer_id": "empr_def456ghi789",
    "benefit": {
      "id": "bprd_medical456",
      "name": "MEC Plus",
      "product_code": "MEC_PLUS",
      "category": "Medical"
    },
    "status": "enrolled",
    "coverage_start": "2026-04-01",
    "coverage_end": "2027-03-31",
    "employee_deduction_in_cents": 5000,
    "employer_contribution_in_cents": 25000,
    "answered_at": "2026-01-20T14:30:00Z",
    "terminated_at": null,
    "created_at": "2026-01-15T10:30:00Z",
    "updated_at": "2026-01-15T10:30:00Z",
    "sbc_url": "https://carrier.example.com/documents/sbc.pdf"
  }
}
```

**SDK Code**

```python Enrollment Detail
import requests

url = "https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ"

headers = {"Authorization": "Bearer <apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Enrollment Detail
const url = 'https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ';
const options = {method: 'GET', headers: {Authorization: 'Bearer <apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Enrollment Detail
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Enrollment Detail
require 'uri'
require 'net/http'

url = URI("https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <apiKey>'

response = http.request(request)
puts response.read_body
```

```java Enrollment Detail
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ")
  .header("Authorization", "Bearer <apiKey>")
  .asString();
```

```php Enrollment Detail
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ', [
  'headers' => [
    'Authorization' => 'Bearer <apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Enrollment Detail
using RestSharp;

var client = new RestClient("https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Enrollment Detail
import Foundation

let headers = ["Authorization": "Bearer <apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.vitablehealth.com/v1/enrollments/enrl_AAAAAAAAAAAAAAAAAAAAAQ")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```