Search employees
curl --request POST \
--url https://api.ignitehealth.com/v1/employees/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"limit": 50,
"offset": 0
}
'import requests
url = "https://api.ignitehealth.com/v1/employees/search"
payload = {
"limit": 50,
"offset": 0
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({limit: 50, offset: 0})
};
fetch('https://api.ignitehealth.com/v1/employees/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ignitehealth.com/v1/employees/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'limit' => 50,
'offset' => 0
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ignitehealth.com/v1/employees/search"
payload := strings.NewReader("{\n \"limit\": 50,\n \"offset\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ignitehealth.com/v1/employees/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"limit\": 50,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ignitehealth.com/v1/employees/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"limit\": 50,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"asOf": "2026-10-13T15:00:00Z",
"employees": [
{
"id": "11111111-1111-4111-8111-111111111111",
"companyId": "company_example",
"personId": "44444444-4444-4444-8444-444444444444",
"externalIds": [
{
"system": "payroll_system",
"system_id": "PAYROLL-001"
}
],
"demographics": {
"firstName": "Avery",
"lastName": "Morgan",
"dateOfBirth": "1990-04-12",
"gender": null
},
"contact": {
"email": "avery.morgan@example.com",
"phone": "+13125550100",
"address": {
"line1": "100 Example Street",
"line2": null,
"city": "Chicago",
"state": "IL",
"postalCode": "60601"
}
},
"membership": {
"status": "active",
"invitation": null
},
"participation": {
"decision": "opt_in",
"decidedAt": "2026-09-25T15:00:00Z"
},
"coverage": {
"status": "enrolled",
"startsAt": "2026-10-01",
"endsAt": "2026-12-31",
"planTier": "example_tier"
},
"createdAt": "2026-09-20T15:00:00Z",
"updatedAt": "2026-10-12T15:00:00Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1
}
}{
"error": "invalid_input"
}{
"error": "invalid_api_key"
}{
"error": "forbidden"
}{
"error": "rate_limited"
}{
"error": "internal_error"
}Search employees
For finding employee records across authorized companies.
POST
/
v1
/
employees
/
search
Search employees
curl --request POST \
--url https://api.ignitehealth.com/v1/employees/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"limit": 50,
"offset": 0
}
'import requests
url = "https://api.ignitehealth.com/v1/employees/search"
payload = {
"limit": 50,
"offset": 0
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({limit: 50, offset: 0})
};
fetch('https://api.ignitehealth.com/v1/employees/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ignitehealth.com/v1/employees/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'limit' => 50,
'offset' => 0
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ignitehealth.com/v1/employees/search"
payload := strings.NewReader("{\n \"limit\": 50,\n \"offset\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ignitehealth.com/v1/employees/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"limit\": 50,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ignitehealth.com/v1/employees/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"limit\": 50,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"asOf": "2026-10-13T15:00:00Z",
"employees": [
{
"id": "11111111-1111-4111-8111-111111111111",
"companyId": "company_example",
"personId": "44444444-4444-4444-8444-444444444444",
"externalIds": [
{
"system": "payroll_system",
"system_id": "PAYROLL-001"
}
],
"demographics": {
"firstName": "Avery",
"lastName": "Morgan",
"dateOfBirth": "1990-04-12",
"gender": null
},
"contact": {
"email": "avery.morgan@example.com",
"phone": "+13125550100",
"address": {
"line1": "100 Example Street",
"line2": null,
"city": "Chicago",
"state": "IL",
"postalCode": "60601"
}
},
"membership": {
"status": "active",
"invitation": null
},
"participation": {
"decision": "opt_in",
"decidedAt": "2026-09-25T15:00:00Z"
},
"coverage": {
"status": "enrolled",
"startsAt": "2026-10-01",
"endsAt": "2026-12-31",
"planTier": "example_tier"
},
"createdAt": "2026-09-20T15:00:00Z",
"updatedAt": "2026-10-12T15:00:00Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1
}
}{
"error": "invalid_input"
}{
"error": "invalid_api_key"
}{
"error": "forbidden"
}{
"error": "rate_limited"
}{
"error": "internal_error"
}The JSON request body may be omitted. Without a
companyId filter, the search covers every company allowed by the key. Filters combine with AND. firstName, lastName, fullName, and email use case-insensitive partial matching. employeeId and personId require exact UUID matches. dateOfBirth is a calendar date in YYYY-MM-DD format, and createdFrom is an inclusive lower bound on Employee creation time.
Phone matching strips nondigits and uses the last 10 digits of the input. Shorter partial numbers also match. A nonempty phone value with no digits is invalid. Empty-string fields are ignored, and text filters are limited to 100 characters. externalIdSystems accepts payroll_system and hhaexchange. This parameter selects returned external IDs without filtering records.
An unsupported externalIdSystems value, an unknown field whose value is not an empty string, or an overlong text filter returns 400 invalid_input with a message naming the value or field. Other invalid filters and request bodies over 1 MiB also return 400 invalid_input. A company ID not accessible to the key returns 403 forbidden.
Results include terminated records, exclude archived records, preserve duplicate employee records, and sort by createdAt then id. Pagination reads live data. Full Social Security numbers are not returned.
Each Employee object includes top-level participation and coverage fields. Each is null when no applicable record exists.Authorizations
Body
application/json
Optional JSON object. Empty-string fields are ignored. Other unsupported fields return 400 invalid_input. Bodies over 1 MiB return 400 invalid_input.