curl --request GET \
--url https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}', 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}/quotes/{quoteId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"quote_id": "qt_5b9e2c7f10ad",
"status": "ready",
"group_id": "grp_8c2f41d09a3e",
"expires_at": "2026-11-01T17:22:05Z",
"plan_year_start_date": "2026-11-01",
"census": {
"employees": 3,
"covered_lives": 4
},
"plans": [
{
"id": "diamond",
"plan_name": "Prescience Diamond",
"status": "ready",
"monthly_premium_cents": 200000,
"pmpm_cents": 50000,
"rates_by_household": [
{
"label": "Employee only",
"households": 2,
"monthly_cents": 50000
},
{
"label": "Employee + 1",
"households": 1,
"monthly_cents": 100000
}
],
"deductible_cents": 0,
"oop_max_cents": 150000,
"max_extra_cents": 600000
},
{
"id": "value",
"plan_name": "Prescience Value",
"status": "ready",
"monthly_premium_cents": 160000,
"pmpm_cents": 40000,
"rates_by_household": [
{
"label": "Employee only",
"households": 2,
"monthly_cents": 40000
},
{
"label": "Employee + 1",
"households": 1,
"monthly_cents": 80000
}
],
"deductible_cents": 300000,
"oop_max_cents": 300000,
"max_extra_cents": 700000
}
]
}Get a quote
Re-fetch a quote, e.g. after a quote.finalized webhook moves it from in_review to ready. Field names are snake_case for broker keys. HR platform partners use camelCase (company_name is companyName).
curl --request GET \
--url https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}', 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}/quotes/{quoteId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getprescience.com/api/partner/v1/groups/{groupId}/quotes/{quoteId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"quote_id": "qt_5b9e2c7f10ad",
"status": "ready",
"group_id": "grp_8c2f41d09a3e",
"expires_at": "2026-11-01T17:22:05Z",
"plan_year_start_date": "2026-11-01",
"census": {
"employees": 3,
"covered_lives": 4
},
"plans": [
{
"id": "diamond",
"plan_name": "Prescience Diamond",
"status": "ready",
"monthly_premium_cents": 200000,
"pmpm_cents": 50000,
"rates_by_household": [
{
"label": "Employee only",
"households": 2,
"monthly_cents": 50000
},
{
"label": "Employee + 1",
"households": 1,
"monthly_cents": 100000
}
],
"deductible_cents": 0,
"oop_max_cents": 150000,
"max_extra_cents": 600000
},
{
"id": "value",
"plan_name": "Prescience Value",
"status": "ready",
"monthly_premium_cents": 160000,
"pmpm_cents": 40000,
"rates_by_household": [
{
"label": "Employee only",
"households": 2,
"monthly_cents": 40000
},
{
"label": "Employee + 1",
"households": 1,
"monthly_cents": 80000
}
],
"deductible_cents": 300000,
"oop_max_cents": 300000,
"max_extra_cents": 700000
}
]
}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.
Path Parameters
Group ID, e.g. grp_8c2f41d09a3e.
^grp_[0-9a-f]{12}$Quote ID, e.g. qt_5b9e2c7f10ad.
^qt_[0-9a-f]{12}$Query Parameters
Broker keys only. numbers (the default) returns each plan's prices, deductible, out-of-pocket maximum and the most extra the company pays. full adds what each plan is: description, benefits, logos. Other partners always get the whole quote.
numbers, full Comma-separated fields to return, e.g. plans.pmpm_cents. Reach into the plans with plans.<field>. quote_id, group_id and status are always returned. Also accepted as fields in a POST body.
Comma-separated fields to leave out, e.g. plans.logos. Logo URLs do not change, so fetch them once, cache them and exclude them after. Also accepted as exclude in a POST body.
Response
The quote.
- Option 1
- Option 2
The quote as a broker gets it: numbers only by default, and what each plan is with view=full.
ready, in_review, expired Show child attributes
Show child attributes
Quote-specific sales previews for employees and employers. Forwardable links include an interactive view and PDF. Pending group links become available when pricing completes; a changed census requires a new quote. Preview terms are subject to underwriting and enrollment. Links are omitted when signing is unavailable.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Plans you sent that were skipped, and why.
Show child attributes
Show child attributes