curl --request POST \
--url https://www.getprescience.com/api/partner/v1/price-on-plan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"census": [
{
"first_name": "Ada",
"last_name": "Reyes",
"dob": "1991-04-02",
"zip": "94110"
}
],
"plan": {
"carrier": "Example Carrier",
"plan_name": "Catastrophic HDHP",
"plan_type": "PPO",
"hsa_eligible": true,
"deductible_individual_cents": 700000,
"oop_max_individual_cents": 900000,
"pmpm_cents": 42000
}
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/price-on-plan"
payload = {
"census": [
{
"first_name": "Ada",
"last_name": "Reyes",
"dob": "1991-04-02",
"zip": "94110"
}
],
"plan": {
"carrier": "Example Carrier",
"plan_name": "Catastrophic HDHP",
"plan_type": "PPO",
"hsa_eligible": True,
"deductible_individual_cents": 700000,
"oop_max_individual_cents": 900000,
"pmpm_cents": 42000
}
}
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({
census: [{first_name: 'Ada', last_name: 'Reyes', dob: '1991-04-02', zip: '94110'}],
plan: {
carrier: 'Example Carrier',
plan_name: 'Catastrophic HDHP',
plan_type: 'PPO',
hsa_eligible: true,
deductible_individual_cents: 700000,
oop_max_individual_cents: 900000,
pmpm_cents: 42000
}
})
};
fetch('https://www.getprescience.com/api/partner/v1/price-on-plan', 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/price-on-plan",
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([
'census' => [
[
'first_name' => 'Ada',
'last_name' => 'Reyes',
'dob' => '1991-04-02',
'zip' => '94110'
]
],
'plan' => [
'carrier' => 'Example Carrier',
'plan_name' => 'Catastrophic HDHP',
'plan_type' => 'PPO',
'hsa_eligible' => true,
'deductible_individual_cents' => 700000,
'oop_max_individual_cents' => 900000,
'pmpm_cents' => 42000
]
]),
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/price-on-plan"
payload := strings.NewReader("{\n \"census\": [\n {\n \"first_name\": \"Ada\",\n \"last_name\": \"Reyes\",\n \"dob\": \"1991-04-02\",\n \"zip\": \"94110\"\n }\n ],\n \"plan\": {\n \"carrier\": \"Example Carrier\",\n \"plan_name\": \"Catastrophic HDHP\",\n \"plan_type\": \"PPO\",\n \"hsa_eligible\": true,\n \"deductible_individual_cents\": 700000,\n \"oop_max_individual_cents\": 900000,\n \"pmpm_cents\": 42000\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/price-on-plan")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"census\": [\n {\n \"first_name\": \"Ada\",\n \"last_name\": \"Reyes\",\n \"dob\": \"1991-04-02\",\n \"zip\": \"94110\"\n }\n ],\n \"plan\": {\n \"carrier\": \"Example Carrier\",\n \"plan_name\": \"Catastrophic HDHP\",\n \"plan_type\": \"PPO\",\n \"hsa_eligible\": true,\n \"deductible_individual_cents\": 700000,\n \"oop_max_individual_cents\": 900000,\n \"pmpm_cents\": 42000\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/price-on-plan")
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 \"census\": [\n {\n \"first_name\": \"Ada\",\n \"last_name\": \"Reyes\",\n \"dob\": \"1991-04-02\",\n \"zip\": \"94110\"\n }\n ],\n \"plan\": {\n \"carrier\": \"Example Carrier\",\n \"plan_name\": \"Catastrophic HDHP\",\n \"plan_type\": \"PPO\",\n \"hsa_eligible\": true,\n \"deductible_individual_cents\": 700000,\n \"oop_max_individual_cents\": 900000,\n \"pmpm_cents\": 42000\n }\n}"
response = http.request(request)
puts response.read_body{
"quote_id": "<string>",
"group_id": "<string>",
"status": "ready",
"reason": "<string>",
"plans": [
{
"id": "diamond",
"plan_name": "<string>",
"status": "ready",
"reason": "<string>",
"your_plan_pmpm_cents": 123,
"prescience_pmpm_cents": 123,
"pmpm_cents": 123,
"monthly_premium_cents": 123,
"prescience_monthly_cents": 123,
"deductible_cents": 123,
"oop_max_cents": 123,
"max_extra_cents": 123
}
],
"assumptions": [
"<string>"
],
"ignored_plans": [
{
"index": 123,
"reason": "metalTier: metalTier is required (for example Platinum, Gold, Silver, Bronze).",
"carrier": "<string>",
"plan_name": "<string>"
}
]
}{
"quote_id": "qt_5b9e2c7f10ad",
"status": "ready",
"group_id": "grp_8c2f41d09a3e",
"plans": [
{
"id": "diamond",
"plan_name": "Prescience Diamond",
"status": "ready",
"your_plan_pmpm_cents": 42000,
"prescience_pmpm_cents": 18000,
"pmpm_cents": 60000,
"monthly_premium_cents": 60000,
"prescience_monthly_cents": 18000,
"deductible_cents": 700000,
"oop_max_cents": 900000,
"max_extra_cents": 450000
}
],
"assumptions": [
"No company was sent, so the census is kept under a generated company."
]
}{
"status": "pricing",
"retry_after_seconds": 123,
"group_id": "<string>",
"message": "<string>",
"ignored_plans": [
{
"index": 123,
"reason": "metalTier: metalTier is required (for example Platinum, Gold, Silver, Bronze).",
"carrier": "<string>",
"plan_name": "<string>"
}
]
}{
"error": "invalid_request",
"message": "<string>",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code",
"index": 7
}
]
}{
"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": "invalid_request",
"message": "<string>",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code",
"index": 7
}
]
}{
"error": "invalid_request",
"message": "<string>",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code",
"index": 7
}
]
}Give one plan, get Diamond and Value on top of it
Send a census and one plan you priced per covered person per month (pmpm_cents); get Prescience Diamond and Prescience Value on top of it. Each has your plan’s price (your_plan_pmpm_cents) plus Prescience’s (prescience_pmpm_cents) = pmpm_cents, the monthly total, your plan’s deductible, the member out-of-pocket maximum and the most extra the company pays if every employee reaches it. Anything defaulted (family deductible and out-of-pocket at twice the individual one, ZIP, company) is listed in assumptions. fields and exclude in the body trim the answer. A plan that can’t be built on answers 200 with status: unavailable and the reason; while pricing runs the answer is 202 with retry_after_seconds: send the same body again.
curl --request POST \
--url https://www.getprescience.com/api/partner/v1/price-on-plan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"census": [
{
"first_name": "Ada",
"last_name": "Reyes",
"dob": "1991-04-02",
"zip": "94110"
}
],
"plan": {
"carrier": "Example Carrier",
"plan_name": "Catastrophic HDHP",
"plan_type": "PPO",
"hsa_eligible": true,
"deductible_individual_cents": 700000,
"oop_max_individual_cents": 900000,
"pmpm_cents": 42000
}
}
'import requests
url = "https://www.getprescience.com/api/partner/v1/price-on-plan"
payload = {
"census": [
{
"first_name": "Ada",
"last_name": "Reyes",
"dob": "1991-04-02",
"zip": "94110"
}
],
"plan": {
"carrier": "Example Carrier",
"plan_name": "Catastrophic HDHP",
"plan_type": "PPO",
"hsa_eligible": True,
"deductible_individual_cents": 700000,
"oop_max_individual_cents": 900000,
"pmpm_cents": 42000
}
}
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({
census: [{first_name: 'Ada', last_name: 'Reyes', dob: '1991-04-02', zip: '94110'}],
plan: {
carrier: 'Example Carrier',
plan_name: 'Catastrophic HDHP',
plan_type: 'PPO',
hsa_eligible: true,
deductible_individual_cents: 700000,
oop_max_individual_cents: 900000,
pmpm_cents: 42000
}
})
};
fetch('https://www.getprescience.com/api/partner/v1/price-on-plan', 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/price-on-plan",
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([
'census' => [
[
'first_name' => 'Ada',
'last_name' => 'Reyes',
'dob' => '1991-04-02',
'zip' => '94110'
]
],
'plan' => [
'carrier' => 'Example Carrier',
'plan_name' => 'Catastrophic HDHP',
'plan_type' => 'PPO',
'hsa_eligible' => true,
'deductible_individual_cents' => 700000,
'oop_max_individual_cents' => 900000,
'pmpm_cents' => 42000
]
]),
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/price-on-plan"
payload := strings.NewReader("{\n \"census\": [\n {\n \"first_name\": \"Ada\",\n \"last_name\": \"Reyes\",\n \"dob\": \"1991-04-02\",\n \"zip\": \"94110\"\n }\n ],\n \"plan\": {\n \"carrier\": \"Example Carrier\",\n \"plan_name\": \"Catastrophic HDHP\",\n \"plan_type\": \"PPO\",\n \"hsa_eligible\": true,\n \"deductible_individual_cents\": 700000,\n \"oop_max_individual_cents\": 900000,\n \"pmpm_cents\": 42000\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/price-on-plan")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"census\": [\n {\n \"first_name\": \"Ada\",\n \"last_name\": \"Reyes\",\n \"dob\": \"1991-04-02\",\n \"zip\": \"94110\"\n }\n ],\n \"plan\": {\n \"carrier\": \"Example Carrier\",\n \"plan_name\": \"Catastrophic HDHP\",\n \"plan_type\": \"PPO\",\n \"hsa_eligible\": true,\n \"deductible_individual_cents\": 700000,\n \"oop_max_individual_cents\": 900000,\n \"pmpm_cents\": 42000\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/price-on-plan")
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 \"census\": [\n {\n \"first_name\": \"Ada\",\n \"last_name\": \"Reyes\",\n \"dob\": \"1991-04-02\",\n \"zip\": \"94110\"\n }\n ],\n \"plan\": {\n \"carrier\": \"Example Carrier\",\n \"plan_name\": \"Catastrophic HDHP\",\n \"plan_type\": \"PPO\",\n \"hsa_eligible\": true,\n \"deductible_individual_cents\": 700000,\n \"oop_max_individual_cents\": 900000,\n \"pmpm_cents\": 42000\n }\n}"
response = http.request(request)
puts response.read_body{
"quote_id": "<string>",
"group_id": "<string>",
"status": "ready",
"reason": "<string>",
"plans": [
{
"id": "diamond",
"plan_name": "<string>",
"status": "ready",
"reason": "<string>",
"your_plan_pmpm_cents": 123,
"prescience_pmpm_cents": 123,
"pmpm_cents": 123,
"monthly_premium_cents": 123,
"prescience_monthly_cents": 123,
"deductible_cents": 123,
"oop_max_cents": 123,
"max_extra_cents": 123
}
],
"assumptions": [
"<string>"
],
"ignored_plans": [
{
"index": 123,
"reason": "metalTier: metalTier is required (for example Platinum, Gold, Silver, Bronze).",
"carrier": "<string>",
"plan_name": "<string>"
}
]
}{
"quote_id": "qt_5b9e2c7f10ad",
"status": "ready",
"group_id": "grp_8c2f41d09a3e",
"plans": [
{
"id": "diamond",
"plan_name": "Prescience Diamond",
"status": "ready",
"your_plan_pmpm_cents": 42000,
"prescience_pmpm_cents": 18000,
"pmpm_cents": 60000,
"monthly_premium_cents": 60000,
"prescience_monthly_cents": 18000,
"deductible_cents": 700000,
"oop_max_cents": 900000,
"max_extra_cents": 450000
}
],
"assumptions": [
"No company was sent, so the census is kept under a generated company."
]
}{
"status": "pricing",
"retry_after_seconds": 123,
"group_id": "<string>",
"message": "<string>",
"ignored_plans": [
{
"index": 123,
"reason": "metalTier: metalTier is required (for example Platinum, Gold, Silver, Bronze).",
"carrier": "<string>",
"plan_name": "<string>"
}
]
}{
"error": "invalid_request",
"message": "<string>",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code",
"index": 7
}
]
}{
"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": "invalid_request",
"message": "<string>",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code",
"index": 7
}
]
}{
"error": "invalid_request",
"message": "<string>",
"details": [
{
"field": "zip",
"message": "zip must be a 5-digit ZIP code",
"index": 7
}
]
}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.
Body
Members, as in PUT /groups/{groupId}/census. Time Machine needs it.
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.
- Option 1
- Option 2
Show child attributes
Show child attributes
The one plan to price Prescience on. It must be HSA-eligible and a PPO, EPO or POS plan; an HMO is rejected. Money is integer cents.
Show child attributes
Show child attributes
Optional. Without it the census is kept under a generated company.
Show child attributes
Show child attributes
Optional: every plan you quoted. With a platinum PPO among them, pricing_method is engine.
500Show child attributes
Show child attributes
Response
The plan can't be built on (an HMO, not HSA-eligible, incomplete): status: unavailable with the reason and ignored_plans.
Both plans, or status: unavailable with a reason when the plan can't be built on (a 200, not an error).