> 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.

# List

GET https://api.vitablehealth.com/v1/employers

Returns the caller's employer book — every employer with its computed columns (enrollment-rate summary, benefit-family tags, HRIS connection, benefit-lifecycle stage) merged with the employer's flat CRM fields (legal name, EIN, contact, address, timestamps). The book is derived from the authenticated principal: one organization's employers, or every organization's for a caller whose reach is not a single organization. Supports search by display name, legal name, or exact EIN, employer id or contact email, benefit-family/lifecycle/HRIS filters, and page/limit pagination.

Reference: https://developer.vitablehealth.com/api/employers/list

## 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

### Query parameters

- `benefit_family` (list of enum, optional, default: []) — Filter to employers with at least one active benefit in these families.
  - Allowed values: `mec`, `mvp`, `ichra`, `vpc`, `dental`, `vision`
- `benefit_lifecycle_stage` (list of enum, optional, default: []) — Filter to employers in one of these computed benefit-lifecycle stages.
  - Allowed values: `open_enrollment`, `renewal`, `active`, `onboarding`, `cancelled`
- `hris_provider` (list of string, optional, default: []) — Filter to employers whose HRIS connection is with one of these payroll providers (e.g. `ADP RUN`). Matched case-insensitively; free text, so read the available values from the HRIS-providers endpoint rather than assuming a fixed set.
- `hris_status` (list of enum, optional, default: []) — Filter to employers whose HRIS connection is in one of these statuses.
  - Allowed values: `Pending`, `Active`, `Inactive`, `Paused`, `Terminated`
- `include_cancelled` (boolean, optional, default: false) — Include cancelled employers (hidden by default unless their stage is explicitly requested).
- `limit` (integer, optional, default: 20) — Items per page.
- `page` (integer, optional, default: 1) — Page number.
- `search` (string, optional) — Employer filter. Matches the display name or the legal name case-insensitively as a substring, or one of these exactly: the EIN (with or without its dash), the employer id, or the contact email of one of the employer's non-disabled admins.

### 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` (list of OrganizationEmployer, required) — This page of employers in the organization.
- `pagination` (Pagination, required) — Page metadata. Request the next page by incrementing `page`.

## 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

Not Found - The requested resource does not exist

- `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

### OrganizationEmployer

One employer row of the organization's book (list projection). Carries the enriched/computed columns (enrollment roll-up, benefit-family tags, HRIS connection, benefit-lifecycle stage) alongside the flat CRM fields of the underlying employer (legal name, EIN, contact, address, timestamps) for parity with the legacy ``Employer`` contract.

- `employer_id` (string, required) — Prefixed employer identifier (`empr_<base64-encoded-uuid>`).
- `organization_id` (string, required, nullable) — ID of the parent organization (`org_*`), or null when unknown.
- `reference_id` (string, required, nullable) — The organization's own reference id for this employer, or null when none was assigned.
- `name` (string, required) — Employer name.
- `legal_name` (string, required, nullable) — Legal business name for compliance and tax purposes.
- `ein` (string, required, nullable) — Employer Identification Number (masked in responses).
- `email` (string, required, nullable) — Email address for billing and communications.
- `phone_number` (string, required, nullable) — Employer phone number.
- `active` (boolean, required) — Whether the employer is currently active in the system.
- `address` (Address, required) — Employer's primary address.
- `created_at` (datetime, required) — Timestamp when the employer was created.
- `updated_at` (datetime, required) — Timestamp when the employer was last updated.
- `enrollment_rate_summary` (_EnrollmentRateSummary, required) — Enrolled/eligible employees roll-up.
- `benefit_families` (list of string, required) — Distinct benefit-family tags across the employer's active benefits (e.g. `MEC`, `ICHRA`, `VPC`).
- `hris_status` (_HrisStatus, required, nullable) — HRIS connection, or null when the employer has none.
- `benefit_lifecycle_stage` (_BenefitLifecycleStage, required) — Where the employer currently sits in the benefits setup lifecycle.

### Pagination

Pagination metadata for list responses.

- `page` (integer, required) — Current page number
- `limit` (integer, required) — Items per page
- `total` (integer, required) — Total number of items
- `total_pages` (integer, required) — Total number of pages

### 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, required) — Primary street address.
- `address_line_2` (string, required, nullable) — Secondary street address (apt, suite, etc.).
- `city` (string, required) — City name.
- `state` (string, required) — Two-letter state code (e.g. `CA`, `NY`).
- `zipcode` (string, required) — ZIP code (5 or 9 digit).

### _EnrollmentRateSummary

- `eligible` (integer, required) — Employees eligible for at least one active benefit.
- `enrolled` (integer, required) — Employees enrolled in at least one active benefit.
- `percentage` (integer, required) — ``enrolled / eligible`` as a whole-number percent (0 when none eligible).

### _HrisStatus

- `provider` (string, required) — Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`).
- `provider_label` (string, required) — Display name of that provider (e.g. `Paylocity`).
- `status` (string, required) — Connection status reported by the integration.

### _BenefitLifecycleStage

- `stage` (string, required) — Computed employer benefit-lifecycle stage: `open_enrollment`, `renewal`, `active`, `onboarding`, or `cancelled`.
- `as_of_date` (date, required, nullable) — Anchor date for the stage (e.g. renewal date); null when not applicable.

## Examples

**Response**

```json
{
  "data": [
    {
      "employer_id": "empr_abc123def456",
      "organization_id": "org_xyz789",
      "reference_id": "partner-emp-001",
      "name": "Acme Corporation",
      "legal_name": "Acme Corporation Inc.",
      "ein": "XX-XXX1234",
      "email": "hr@acme.com",
      "phone_number": "4155550100",
      "active": true,
      "address": {
        "address_line_1": "123 Main Street",
        "address_line_2": "Suite 100",
        "city": "San Francisco",
        "state": "CA",
        "zipcode": "94102"
      },
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-06-20T14:45:00Z",
      "enrollment_rate_summary": {
        "eligible": 84,
        "enrolled": 78,
        "percentage": 93
      },
      "benefit_families": [
        "MEC",
        "ICHRA"
      ],
      "hris_status": {
        "provider": "paychex_flex",
        "provider_label": "Paychex Flex",
        "status": "Active"
      },
      "benefit_lifecycle_stage": {
        "stage": "active",
        "as_of_date": "2026-12-31"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 1,
    "total_pages": 1
  }
}
```

**SDK Code**

```python Employers List
import requests

url = "https://api.vitablehealth.com/v1/employers"

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

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

print(response.json())
```

```javascript Employers List
const url = 'https://api.vitablehealth.com/v1/employers';
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 Employers List
package main

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

func main() {

	url := "https://api.vitablehealth.com/v1/employers"

	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 Employers List
require 'uri'
require 'net/http'

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

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 Employers List
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

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

```php Employers List
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp Employers List
using RestSharp;

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

```swift Employers List
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.vitablehealth.com/v1/employers")! 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()
```