Search persons
curl --request POST \
--url https://sandbox-api.ignitehealth.com/v1/persons/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"companyId": "company_example",
"limit": 50,
"offset": 0
}
'import requests
url = "https://sandbox-api.ignitehealth.com/v1/persons/search"
payload = {
"companyId": "company_example",
"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({companyId: 'company_example', limit: 50, offset: 0})
};
fetch('https://sandbox-api.ignitehealth.com/v1/persons/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://sandbox-api.ignitehealth.com/v1/persons/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([
'companyId' => 'company_example',
'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://sandbox-api.ignitehealth.com/v1/persons/search"
payload := strings.NewReader("{\n \"companyId\": \"company_example\",\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://sandbox-api.ignitehealth.com/v1/persons/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"company_example\",\n \"limit\": 50,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.ignitehealth.com/v1/persons/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 \"companyId\": \"company_example\",\n \"limit\": 50,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"asOf": "2026-10-13T15:00:00Z",
"persons": [
{
"id": "44444444-4444-4444-8444-444444444444",
"employments": [
{
"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-01T00:00:00Z",
"endsAt": null,
"planTier": "example_tier"
},
"createdAt": "2026-09-20T15:00:00Z",
"updatedAt": "2026-10-12T15:00:00Z"
}
],
"createdAt": "2026-09-20T15:00:00Z",
"updatedAt": "2026-10-12T15:00:00Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1
}
}Coming soon
Search persons
Draft contract for finding people across authorized employments.
POST
/
v1
/
persons
/
search
Search persons
curl --request POST \
--url https://sandbox-api.ignitehealth.com/v1/persons/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"companyId": "company_example",
"limit": 50,
"offset": 0
}
'import requests
url = "https://sandbox-api.ignitehealth.com/v1/persons/search"
payload = {
"companyId": "company_example",
"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({companyId: 'company_example', limit: 50, offset: 0})
};
fetch('https://sandbox-api.ignitehealth.com/v1/persons/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://sandbox-api.ignitehealth.com/v1/persons/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([
'companyId' => 'company_example',
'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://sandbox-api.ignitehealth.com/v1/persons/search"
payload := strings.NewReader("{\n \"companyId\": \"company_example\",\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://sandbox-api.ignitehealth.com/v1/persons/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"company_example\",\n \"limit\": 50,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.ignitehealth.com/v1/persons/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 \"companyId\": \"company_example\",\n \"limit\": 50,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"asOf": "2026-10-13T15:00:00Z",
"persons": [
{
"id": "44444444-4444-4444-8444-444444444444",
"employments": [
{
"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-01T00:00:00Z",
"endsAt": null,
"planTier": "example_tier"
},
"createdAt": "2026-09-20T15:00:00Z",
"updatedAt": "2026-10-12T15:00:00Z"
}
],
"createdAt": "2026-09-20T15:00:00Z",
"updatedAt": "2026-10-12T15:00:00Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1
}
}Coming soon — unavailable in sandbox and production. The code sample uses the current Partner API host for illustration; the final hostname and contract are undecided. Do not send requests to this route.
Filters would combine with AND. Company, name, and phone filters must match the same authorized employment. They would select people, not trim a matching person’s returned
employments array.
The proposal returns each person once with all their employments in credential-authorized companies, including terminated records. Each employment is a complete Employee object with top-level participation and coverage. It paginates people rather than employments and sorts by Person createdAt then id. Employee records without a Person link remain available through Search employees.
Response-size limits for complete employment arrays remain undecided.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Optional authorized company filter.
Match on an authorized employment after normalization; accepted formats undecided.
Proposed case-insensitive partial match on an authorized employment.
Proposed case-insensitive partial match on an authorized employment.
Exact Person UUID match.
Selects returned external IDs; does not filter records.
Inclusive Person creation-time lower bound.
Exclusive Person creation-time upper bound.
Required range:
1 <= x <= 100Required range:
x >= 0