curl --request POST \
--url https://www.getprescience.com/api/partner/v1/groups \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalId": "co_4821",
"companyName": "Acme Inc",
"domain": "acme.com",
"address": {
"line1": "548 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94104"
},
"contact": {
"name": "Dana Park",
"email": "dana@acme.com",
"title": "Head of People"
},
"currentCoverage": {
"planType": "fully_insured",
"carrier": "Anthem",
"pepmCents": 80000,
"renewalDate": "2026-09-01"
}
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/groups"
payload = {
"externalId": "co_4821",
"companyName": "Acme Inc",
"domain": "acme.com",
"address": {
"line1": "548 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94104"
},
"contact": {
"name": "Dana Park",
"email": "dana@acme.com",
"title": "Head of People"
},
"currentCoverage": {
"planType": "fully_insured",
"carrier": "Anthem",
"pepmCents": 80000,
"renewalDate": "2026-09-01"
}
}
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: 'co_4821',
companyName: 'Acme Inc',
domain: 'acme.com',
address: {line1: '548 Market St', city: 'San Francisco', state: 'CA', zip: '94104'},
contact: {name: 'Dana Park', email: 'dana@acme.com', title: 'Head of People'},
currentCoverage: {
planType: 'fully_insured',
carrier: 'Anthem',
pepmCents: 80000,
renewalDate: '2026-09-01'
}
})
};
fetch('https://www.getprescience.com/api/partner/v1/groups', 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",
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' => 'co_4821',
'companyName' => 'Acme Inc',
'domain' => 'acme.com',
'address' => [
'line1' => '548 Market St',
'city' => 'San Francisco',
'state' => 'CA',
'zip' => '94104'
],
'contact' => [
'name' => 'Dana Park',
'email' => 'dana@acme.com',
'title' => 'Head of People'
],
'currentCoverage' => [
'planType' => 'fully_insured',
'carrier' => 'Anthem',
'pepmCents' => 80000,
'renewalDate' => '2026-09-01'
]
]),
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"
payload := strings.NewReader("{\n \"externalId\": \"co_4821\",\n \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"address\": {\n \"line1\": \"548 Market St\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zip\": \"94104\"\n },\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\",\n \"title\": \"Head of People\"\n },\n \"currentCoverage\": {\n \"planType\": \"fully_insured\",\n \"carrier\": \"Anthem\",\n \"pepmCents\": 80000,\n \"renewalDate\": \"2026-09-01\"\n }\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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalId\": \"co_4821\",\n \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"address\": {\n \"line1\": \"548 Market St\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zip\": \"94104\"\n },\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\",\n \"title\": \"Head of People\"\n },\n \"currentCoverage\": {\n \"planType\": \"fully_insured\",\n \"carrier\": \"Anthem\",\n \"pepmCents\": 80000,\n \"renewalDate\": \"2026-09-01\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/groups")
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\": \"co_4821\",\n \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"address\": {\n \"line1\": \"548 Market St\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zip\": \"94104\"\n },\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\",\n \"title\": \"Head of People\"\n },\n \"currentCoverage\": {\n \"planType\": \"fully_insured\",\n \"carrier\": \"Anthem\",\n \"pepmCents\": 80000,\n \"renewalDate\": \"2026-09-01\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "grp_8c2f41d09a3e",
"mode": "test",
"status": "created",
"companyName": "Acme Inc",
"domain": "acme.com",
"externalId": "co_4821",
"address": {
"line1": "548 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94104"
},
"contact": {
"name": "Dana Park",
"email": "dana@acme.com",
"title": "Head of People"
},
"currentCoverage": {
"planType": "fully_insured",
"carrier": "Anthem",
"pepmCents": 80000,
"renewalDate": "2026-09-01"
},
"censusMemberCount": 0,
"companyState": null,
"createdAt": "2026-06-10T17:04:11Z",
"updatedAt": "2026-06-10T17:04:11Z"
}{
"error": "invalid_request",
"message": "companyName is required.",
"details": [
{
"field": "companyName",
"message": "companyName is required"
}
]
}{
"error": "unauthorized",
"message": "Provide a valid partner API key as `Authorization: Bearer psk_...`."
}{
"error": "live_mode_disabled",
"message": "Live mode is not enabled for this account yet. Complete the go-live checklist to enable live keys."
}{
"error": "conflict",
"message": "An enrolled group already exists for acme.com."
}{
"error": "rate_limited",
"message": "Rate limit exceeded. Retry after 12 seconds."
}{
"error": "server_error",
"message": "Internal error. The request was not applied."
}Create a group
Creates an employer group. companyName and domain are the only required fields; currentCoverage.pepmCents powers the savings comparison on quotes.
curl --request POST \
--url https://www.getprescience.com/api/partner/v1/groups \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalId": "co_4821",
"companyName": "Acme Inc",
"domain": "acme.com",
"address": {
"line1": "548 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94104"
},
"contact": {
"name": "Dana Park",
"email": "dana@acme.com",
"title": "Head of People"
},
"currentCoverage": {
"planType": "fully_insured",
"carrier": "Anthem",
"pepmCents": 80000,
"renewalDate": "2026-09-01"
}
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/groups"
payload = {
"externalId": "co_4821",
"companyName": "Acme Inc",
"domain": "acme.com",
"address": {
"line1": "548 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94104"
},
"contact": {
"name": "Dana Park",
"email": "dana@acme.com",
"title": "Head of People"
},
"currentCoverage": {
"planType": "fully_insured",
"carrier": "Anthem",
"pepmCents": 80000,
"renewalDate": "2026-09-01"
}
}
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: 'co_4821',
companyName: 'Acme Inc',
domain: 'acme.com',
address: {line1: '548 Market St', city: 'San Francisco', state: 'CA', zip: '94104'},
contact: {name: 'Dana Park', email: 'dana@acme.com', title: 'Head of People'},
currentCoverage: {
planType: 'fully_insured',
carrier: 'Anthem',
pepmCents: 80000,
renewalDate: '2026-09-01'
}
})
};
fetch('https://www.getprescience.com/api/partner/v1/groups', 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",
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' => 'co_4821',
'companyName' => 'Acme Inc',
'domain' => 'acme.com',
'address' => [
'line1' => '548 Market St',
'city' => 'San Francisco',
'state' => 'CA',
'zip' => '94104'
],
'contact' => [
'name' => 'Dana Park',
'email' => 'dana@acme.com',
'title' => 'Head of People'
],
'currentCoverage' => [
'planType' => 'fully_insured',
'carrier' => 'Anthem',
'pepmCents' => 80000,
'renewalDate' => '2026-09-01'
]
]),
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"
payload := strings.NewReader("{\n \"externalId\": \"co_4821\",\n \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"address\": {\n \"line1\": \"548 Market St\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zip\": \"94104\"\n },\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\",\n \"title\": \"Head of People\"\n },\n \"currentCoverage\": {\n \"planType\": \"fully_insured\",\n \"carrier\": \"Anthem\",\n \"pepmCents\": 80000,\n \"renewalDate\": \"2026-09-01\"\n }\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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalId\": \"co_4821\",\n \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"address\": {\n \"line1\": \"548 Market St\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zip\": \"94104\"\n },\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\",\n \"title\": \"Head of People\"\n },\n \"currentCoverage\": {\n \"planType\": \"fully_insured\",\n \"carrier\": \"Anthem\",\n \"pepmCents\": 80000,\n \"renewalDate\": \"2026-09-01\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/groups")
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\": \"co_4821\",\n \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"address\": {\n \"line1\": \"548 Market St\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zip\": \"94104\"\n },\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\",\n \"title\": \"Head of People\"\n },\n \"currentCoverage\": {\n \"planType\": \"fully_insured\",\n \"carrier\": \"Anthem\",\n \"pepmCents\": 80000,\n \"renewalDate\": \"2026-09-01\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "grp_8c2f41d09a3e",
"mode": "test",
"status": "created",
"companyName": "Acme Inc",
"domain": "acme.com",
"externalId": "co_4821",
"address": {
"line1": "548 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94104"
},
"contact": {
"name": "Dana Park",
"email": "dana@acme.com",
"title": "Head of People"
},
"currentCoverage": {
"planType": "fully_insured",
"carrier": "Anthem",
"pepmCents": 80000,
"renewalDate": "2026-09-01"
},
"censusMemberCount": 0,
"companyState": null,
"createdAt": "2026-06-10T17:04:11Z",
"updatedAt": "2026-06-10T17:04:11Z"
}{
"error": "invalid_request",
"message": "companyName is required.",
"details": [
{
"field": "companyName",
"message": "companyName is required"
}
]
}{
"error": "unauthorized",
"message": "Provide a valid partner API key as `Authorization: Bearer psk_...`."
}{
"error": "live_mode_disabled",
"message": "Live mode is not enabled for this account yet. Complete the go-live checklist to enable live keys."
}{
"error": "conflict",
"message": "An enrolled group already exists for acme.com."
}{
"error": "rate_limited",
"message": "Rate limit exceeded. Retry after 12 seconds."
}{
"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. Keys are stored hashed and cannot be recovered; store them in your secrets manager on issue.
Headers
Any unique string (UUIDs work well). Replaying the same key within 24 hours returns the stored response instead of re-executing the request.
255Body
"Acme Inc"
Primary company domain. One enrolled group per domain per mode.
"acme.com"
Your internal employer ID. Echoed back on the group and useful for reconciliation.
"co_4821"
"Acme Incorporated"
"94-2404110"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The employer's coverage today. pepmCents is used as the savings baseline when quoting unless overridden per-quote.
Show child attributes
Show child attributes
Response
Group created.
"grp_8c2f41d09a3e"
test, live Lifecycle: created -> census_received -> quoted -> enrolled -> active (active = company flipped to prod by Prescience).
created, census_received, quoted, enrolled, active "Acme Inc"
"acme.com"
12
Your internal employer ID.
"co_4821"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The employer's coverage today. pepmCents is used as the savings baseline when quoting unless overridden per-quote.
Show child attributes
Show child attributes
null until enrolled, then sandbox, then prod once Prescience activates the group.
sandbox, prod, null