curl --request POST \
--url https://www.getprescience.com/api/partner/v1/groups/{groupId}/members \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalId": "emp_0013",
"firstName": "Omar",
"lastName": "Haddad",
"email": "omar@acme.com",
"dob": "1994-08-23",
"zip": "94117",
"employmentType": "full_time",
"hireDate": "2026-11-02"
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/groups/{groupId}/members"
payload = {
"externalId": "emp_0013",
"firstName": "Omar",
"lastName": "Haddad",
"email": "omar@acme.com",
"dob": "1994-08-23",
"zip": "94117",
"employmentType": "full_time",
"hireDate": "2026-11-02"
}
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({
externalId: 'emp_0013',
firstName: 'Omar',
lastName: 'Haddad',
email: 'omar@acme.com',
dob: '1994-08-23',
zip: '94117',
employmentType: 'full_time',
hireDate: '2026-11-02'
})
};
fetch('https://www.getprescience.com/api/partner/v1/groups/{groupId}/members', 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://www.getprescience.com/api/partner/v1/groups/{groupId}/members",
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([
'externalId' => 'emp_0013',
'firstName' => 'Omar',
'lastName' => 'Haddad',
'email' => 'omar@acme.com',
'dob' => '1994-08-23',
'zip' => '94117',
'employmentType' => 'full_time',
'hireDate' => '2026-11-02'
]),
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://www.getprescience.com/api/partner/v1/groups/{groupId}/members"
payload := strings.NewReader("{\n \"externalId\": \"emp_0013\",\n \"firstName\": \"Omar\",\n \"lastName\": \"Haddad\",\n \"email\": \"omar@acme.com\",\n \"dob\": \"1994-08-23\",\n \"zip\": \"94117\",\n \"employmentType\": \"full_time\",\n \"hireDate\": \"2026-11-02\"\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://www.getprescience.com/api/partner/v1/groups/{groupId}/members")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalId\": \"emp_0013\",\n \"firstName\": \"Omar\",\n \"lastName\": \"Haddad\",\n \"email\": \"omar@acme.com\",\n \"dob\": \"1994-08-23\",\n \"zip\": \"94117\",\n \"employmentType\": \"full_time\",\n \"hireDate\": \"2026-11-02\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/groups/{groupId}/members")
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 \"externalId\": \"emp_0013\",\n \"firstName\": \"Omar\",\n \"lastName\": \"Haddad\",\n \"email\": \"omar@acme.com\",\n \"dob\": \"1994-08-23\",\n \"zip\": \"94117\",\n \"employmentType\": \"full_time\",\n \"hireDate\": \"2026-11-02\"\n}"
response = http.request(request)
puts response.read_body{
"memberId": "mem_5e1da8c47f92",
"externalId": "emp_0013",
"firstName": "Omar",
"lastName": "Haddad",
"email": "omar@acme.com",
"dob": "1994-08-23",
"zip": "94117",
"employmentType": "full_time",
"hireDate": "2026-11-02",
"status": "active"
}{
"error": "invalid_request",
"message": "zip must be a 5-digit ZIP code.",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code"
}
]
}{
"error": "unauthorized",
"message": "Provide a valid partner API key as `Authorization: Bearer psk_...`."
}{
"error": "not_found",
"message": "No group grp_8c2f41d09a3e found."
}{
"error": "rate_limited",
"message": "Too many requests. Please retry later."
}{
"error": "server_error",
"message": "Internal error. The request was not applied."
}Add a member
Adds one member to the census: the new-hire path. After enrollment, additions propagate to the live company census automatically.
curl --request POST \
--url https://www.getprescience.com/api/partner/v1/groups/{groupId}/members \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalId": "emp_0013",
"firstName": "Omar",
"lastName": "Haddad",
"email": "omar@acme.com",
"dob": "1994-08-23",
"zip": "94117",
"employmentType": "full_time",
"hireDate": "2026-11-02"
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/groups/{groupId}/members"
payload = {
"externalId": "emp_0013",
"firstName": "Omar",
"lastName": "Haddad",
"email": "omar@acme.com",
"dob": "1994-08-23",
"zip": "94117",
"employmentType": "full_time",
"hireDate": "2026-11-02"
}
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({
externalId: 'emp_0013',
firstName: 'Omar',
lastName: 'Haddad',
email: 'omar@acme.com',
dob: '1994-08-23',
zip: '94117',
employmentType: 'full_time',
hireDate: '2026-11-02'
})
};
fetch('https://www.getprescience.com/api/partner/v1/groups/{groupId}/members', 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://www.getprescience.com/api/partner/v1/groups/{groupId}/members",
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([
'externalId' => 'emp_0013',
'firstName' => 'Omar',
'lastName' => 'Haddad',
'email' => 'omar@acme.com',
'dob' => '1994-08-23',
'zip' => '94117',
'employmentType' => 'full_time',
'hireDate' => '2026-11-02'
]),
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://www.getprescience.com/api/partner/v1/groups/{groupId}/members"
payload := strings.NewReader("{\n \"externalId\": \"emp_0013\",\n \"firstName\": \"Omar\",\n \"lastName\": \"Haddad\",\n \"email\": \"omar@acme.com\",\n \"dob\": \"1994-08-23\",\n \"zip\": \"94117\",\n \"employmentType\": \"full_time\",\n \"hireDate\": \"2026-11-02\"\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://www.getprescience.com/api/partner/v1/groups/{groupId}/members")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalId\": \"emp_0013\",\n \"firstName\": \"Omar\",\n \"lastName\": \"Haddad\",\n \"email\": \"omar@acme.com\",\n \"dob\": \"1994-08-23\",\n \"zip\": \"94117\",\n \"employmentType\": \"full_time\",\n \"hireDate\": \"2026-11-02\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/groups/{groupId}/members")
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 \"externalId\": \"emp_0013\",\n \"firstName\": \"Omar\",\n \"lastName\": \"Haddad\",\n \"email\": \"omar@acme.com\",\n \"dob\": \"1994-08-23\",\n \"zip\": \"94117\",\n \"employmentType\": \"full_time\",\n \"hireDate\": \"2026-11-02\"\n}"
response = http.request(request)
puts response.read_body{
"memberId": "mem_5e1da8c47f92",
"externalId": "emp_0013",
"firstName": "Omar",
"lastName": "Haddad",
"email": "omar@acme.com",
"dob": "1994-08-23",
"zip": "94117",
"employmentType": "full_time",
"hireDate": "2026-11-02",
"status": "active"
}{
"error": "invalid_request",
"message": "zip must be a 5-digit ZIP code.",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code"
}
]
}{
"error": "unauthorized",
"message": "Provide a valid partner API key as `Authorization: Bearer psk_...`."
}{
"error": "not_found",
"message": "No group grp_8c2f41d09a3e found."
}{
"error": "rate_limited",
"message": "Too many requests. Please retry later."
}{
"error": "server_error",
"message": "Internal error. The request was not applied."
}Authorizations
Partner API key. psk_test_<32 hex> for test mode, psk_live_<32 hex> for live mode. Store them in your secrets manager on issue. Live keys are shown once; the scoped partner portal can show an active sandbox key again.
Headers
Any non-empty string; deterministic keys from your own IDs work best. Repeating the same key with the same body on the same endpoint and mode within 24 hours returns the stored successful response (with Idempotent-Replay: true) instead of re-executing. Error responses are not stored.
Path Parameters
Group ID, e.g. grp_8c2f41d09a3e.
^grp_[0-9a-f]{12}$Body
- Option 1
- Option 2
One employee record. Include dependent elections when your platform has them; submitted dependents drive covered lives and household tiers. When they are unavailable, Prescience uses a disclosed normalized small-group household mix for the preliminary model.
Required for every employee and dependent of a broker; a broker's member sent with only an age is rejected.
"1992-03-14"
5-digit home ZIP. Drives local market selection and rating.
^[0-9]{5}$"94110"
Your payroll's employee ID (Check Employee.id). Required at enrollment; the upsert key, and how payroll results find the employee.
"emp_0001"
"Jordan"
"Reyes"
Upsert key when present.
"jordan@acme.com"
Alternative to dob. One of the two is required.
34
male, female, other full_time, part_time, contractor "2024-03-01"
active, terminated Optional household members already known to your platform.
6Show child attributes
Show child attributes
Response
Member stored.
- Option 1
- Option 2
Partial update: send only the fields you are changing. Terminate with status: "terminated" and terminationDate; add cobra: true, coverageLossDate, and the mailing address to offer COBRA.
Required for every employee and dependent of a broker; a broker's member sent with only an age is rejected.
"1992-03-14"
5-digit home ZIP. Drives the area factor in rating.
^[0-9]{5}$"94110"
Server-assigned ID. Use it for PATCH /groups/{groupId}/members/{memberId}.
"mem_c4a91f27e83d"
Your payroll's employee ID (Check Employee.id). Required at enrollment; the upsert key, and how payroll results find the employee.
"emp_0001"
"Jordan"
"Reyes"
Upsert key when present.
"jordan@acme.com"
Alternative to dob. One of the two is required.
34
male, female, other full_time, part_time, contractor "2024-03-01"
active, terminated Optional household members already known to your platform.
6Show child attributes
Show child attributes
"2026-11-15"
Offer COBRA continuation on termination. With status: "terminated", requires terminationDate, coverageLossDate, and the full mailing address.
Last day of employer coverage. Required for a COBRA termination.
"2026-11-30"
termination, hours_reduction, employee_death Optional non-work address for COBRA notices. Must not be on the employee's work email domain.
Household mailing address. Required for a COBRA termination, with mailingCity, mailingState, and mailingPostalCode.
"CA"
"94110"
true when the employer marked this employee as waiving coverage in the iframe. They stay on the census.
Why the employee waived, when excludedFromQuote is true.