Skip to main content
POST /groups/{groupId}/quotes rates the stored census and returns the complete quote in the same response. No polling and no callback; most groups price in under a second.

Create a quote

curl -X POST https://www.getprescience.com/api/partner/v1/groups/grp_8c2f41d09a3e/quotes \
  -H "Authorization: Bearer $PRESCIENCE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "planYearStartDate": "2026-09-01", "priorPepmCents": 80000 }'
Both fields are optional:
FieldTypeDefaultUse
planYearStartDatedate (YYYY-MM-DD)First of the month at least 60 days outAlign to the employer’s current renewal date.
priorPepmCentsinteger (cents)group.currentCoverage.pepmCentsOverride the savings baseline for this quote only.
Requires a quotable census (every member with zip plus dob | age), otherwise 422 census_required. Rate limit: 60 quote creates per hour.

The Quote object

The quickstart quote for Acme Inc (12 employees, 19 covered lives, San Francisco), section by section:

status + pricingBasis: what this quote is

{ "status": "ready", "pricingBasis": "indicative" }
pricingBasis is always indicative: rates are indicative pending underwriting confirmation and bind only at enrollment plus underwriting sign-off. Display this framing wherever you show the numbers; “indicative pricing” or the quote’s own assumptions strings work.status is ready for nearly all groups. See large groups below for in_review.
{
  "census": { "employees": 12, "coveredLives": 19,
              "tiers": { "employeeOnly": 7, "employeeSpouse": 2, "employeeChildren": 1, "family": 2 } },
  "monthly": { "totalCents": 660096, "pepmCents": 55008,
               "byTier": { "employeeOnly": { "count": 7, "avgCents": 34047 },
                           "employeeSpouse": { "count": 2, "avgCents": 89166 },
                           "employeeChildren": { "count": 1, "avgCents": 53987 },
                           "family": { "count": 2, "avgCents": 94724 } } },
  "annual": { "totalCents": 7921152 }
}
monthly.totalCents is the employer’s all-in monthly cost: $6,600.96 here. pepmCents is total ÷ active employees ($550.08). byTier gives average member cost per coverage tier for display; tiers classify members by whether they cover a spouse and/or children.
{ "employeeContribution": { "premiumCents": 0 } }
Employee premium contribution for this plan. Values are integer cents.
{
  "comparison": { "priorPepmCents": 80000, "savingsMonthlyCents": 299904,
                  "savingsAnnualCents": 3598848, "savingsPct": 31 }
}
Computed against priorPepmCents, which comes from the quote request override or group.currentCoverage.pepmCents. If no prior PEPM was provided, the savings fields are zero. savingsPct is rounded to the nearest whole percent.
{
  "fundingBreakdown": { "expectedClaimsPct": 78, "stopLossPct": 12,
                        "careNavigationPct": 10, "adminFeesPct": 0,
                        "note": "Illustrative split of the premium-equivalent." }
}
Illustrative allocation of the quoted monthly amount. The account data guide covers in-force funding and spend fields after enrollment.
{
  "expiresAt": "2026-07-10T17:22:05Z",
  "assumptions": [ "Rates are indicative pending underwriting confirmation.",
                   "Census accepted as submitted; material changes re-rate." ]
}
Quote expiry is configuration-driven; the default window is 30 days after creation. Enrolling against an expired quote returns 410 quote_expired; create a fresh one. An unchanged census re-prices identically. Preserve the assumptions strings anywhere quote terms are displayed.
{ "pricing": { "source": "code_default" } }
Names the pricing-rules layer that produced this quote. Additive in v1.1; absent on quotes created before it, and every other quote field is unchanged.
FieldTypeDescription
sourceenum: code_default | default | partnerpartner: integration-specific pricing configuration. default: platform default pricing configuration. code_default: built-in defaults.
updatedAttimestampWhen the applied rate card was last updated. Absent for code_default.
The quote expiry window and the in-review employee threshold are also set by pricing configuration; the defaults are 30 days and 200 employees. Quotes created before a configuration change are not re-priced.

How the engine prices a census

Deterministic and pure: the same census, start date, and pricing configuration always produce the same cents. The API returns the computed result; integrations should store the returned quote rather than reimplementing rating logic. At a high level, the rating engine uses:
  1. Active employee and dependent census records.
  2. Member age at planYearStartDate, computed from dob or the submitted age.
  3. Home ZIP code for geographic rating.
  4. Coverage tier classification from covered dependents.
  5. The applied pricing configuration named by pricing.source.
Terminated members are excluded. PEPM is the rounded total over active employees.
You never need to reimplement any of this. It’s documented so the numbers aren’t a black box, and so your team can verify a quote by hand if they want to.

Large groups: in_review

Groups above the configured in-review employee threshold (default 200 employees) return status: "in_review" instead of ready. The monthly figures are present but held for Prescience underwriting review. When underwriting finalizes, the quote flips to ready and the quote.finalized webhook fires. Re-fetch with GET /groups/{groupId}/quotes/{quoteId}. Show these groups a “pricing in final review” state rather than the held numbers.

Listing and re-fetching

  • GET /groups/{groupId}/quotes: all quotes for a group, newest first, paginated with limit/cursor.
  • GET /groups/{groupId}/quotes/{quoteId}: one quote, e.g. after quote.finalized.
Old quotes are never mutated (beyond in_review → ready and expiry); each re-quote is a new record, so you keep a full pricing history per employer.