curl --request POST \
--url https://www.getprescience.com/api/partner/v1/groups \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"companyName": "Acme Inc",
"domain": "acme.com",
"contact": {
"name": "Dana Park",
"email": "dana@acme.com"
}
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/groups"
payload = {
"companyName": "Acme Inc",
"domain": "acme.com",
"contact": {
"name": "Dana Park",
"email": "dana@acme.com"
}
}
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({
companyName: 'Acme Inc',
domain: 'acme.com',
contact: {name: 'Dana Park', email: 'dana@acme.com'}
})
};
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([
'companyName' => 'Acme Inc',
'domain' => 'acme.com',
'contact' => [
'name' => 'Dana Park',
'email' => 'dana@acme.com'
]
]),
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 \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\"\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 \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\"\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 \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\"\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 account from four required values: companyName, domain, contact.name, and contact.email. Prior coverage, prior PEPM, address, title, and external ID are not required.
curl --request POST \
--url https://www.getprescience.com/api/partner/v1/groups \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"companyName": "Acme Inc",
"domain": "acme.com",
"contact": {
"name": "Dana Park",
"email": "dana@acme.com"
}
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/groups"
payload = {
"companyName": "Acme Inc",
"domain": "acme.com",
"contact": {
"name": "Dana Park",
"email": "dana@acme.com"
}
}
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({
companyName: 'Acme Inc',
domain: 'acme.com',
contact: {name: 'Dana Park', email: 'dana@acme.com'}
})
};
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([
'companyName' => 'Acme Inc',
'domain' => 'acme.com',
'contact' => [
'name' => 'Dana Park',
'email' => 'dana@acme.com'
]
]),
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 \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\"\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 \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\"\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 \"companyName\": \"Acme Inc\",\n \"domain\": \"acme.com\",\n \"contact\": {\n \"name\": \"Dana Park\",\n \"email\": \"dana@acme.com\"\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"
Show child attributes
Show child attributes
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
Optional historical coverage metadata. It is not required for market-rate quotes.
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
Optional historical coverage metadata. It is not required for market-rate quotes.
Show child attributes
Show child attributes
null until enrolled, then sandbox, then prod once Prescience activates the group.
sandbox, prod, null