Skip to main content
POST /groups/{groupId}/quotes prices Prescience Diamond from the stored census and the group’s latest market-rate snapshot. These examples show the quote an HR platform key gets, with camelCase field names. A broker key gets the quote described in Reading a quote, in snake_case.

Before creating a quote

A census change that affects rating starts a new market comparison. If the comparison is still running, quote creation returns:
Response (409)
Subscribe to the group.market_rates_ready webhook to create the quote as soon as rates land instead of polling. Retry with backoff. The Bolto iframe manages this state automatically and displays the pricing progress to the employer.

Create a quote

No prior-plan cost is needed. This works for a first-time employer with no coverage history: Prescience compares Diamond with the group’s current local platinum PPO benchmark. The plan underneath Diamond must be an HSA-eligible PPO, EPO or POS, so employees can pair it with an HSA. It is never an HMO.
priorPepmCents is optional. If you send it (any number of cents, 0 or more), it is echoed back unchanged in comparison.priorPepmCents; otherwise, or when you send 0, that field is null. It does not affect pricing. If the rates are in but the group cannot be priced, for example because the census has no active quotable employees or the market has no platinum plan to compare with (only a platinum PPO counts) or no HSA-eligible PPO, EPO or POS to build Diamond on, the API returns 422 market_unavailable. The same happens if the market comparison itself failed (you also get group.market_rates_failed). That is not a timing problem, so retrying does not help; Prescience reviews the group, and a census change starts a new comparison.

Pricing basis and comparison

  • monthly.totalCents is the modeled monthly employer cost.
  • monthly.pepmCents is the cost per enrolling employee: totalCents divided by census.employees.
  • monthly.pmpmCents is the price per covered life, dependents included. This is the rate the quote is set at.
  • comparison measures the price against benchmarkPlan, the most expensive platinum PPO quoted for the group (the most expensive platinum plan when there is no PPO).
  • reserve.annualCents is the most the employer could owe on top of the price in a year where every member reaches the plan’s out-of-pocket maximum. It is disclosed, never added to the price.
  • The price is set once per census, when the market comparison finishes. The iframe estimate, this endpoint and GET /groups/{groupId}/account all read that one price, so they always agree. A census change that affects rating starts a new comparison and a new price. An unchanged census keeps its current price.
  • savingsMonthlyCents and savingsAnnualCents are never negative: when the model prices above the benchmark they are 0, and savingsPct is negative. Check savingsPct before showing a savings claim.
  • monthly.byTier reports tier counts. Its avgCents values are null on market-rate quotes, which price the whole group rather than each tier.
Dollar values above are illustrative. Do not hard-code them in an integration test.

Census and household assumptions

When the census includes dependents, the submitted household composition drives covered lives and coverage tiers. When no dependent elections are available, Prescience uses a stable normalized small-group mix instead of treating the entire company as employee-only.
census.tiers counts real households in four tiers: employeeOnly, employeeSpouse (a spouse, no children), employeeChildren (children, no spouse) and family (a spouse and children). Preserve assumptions anywhere the price is displayed. Census or dependent changes that affect rating require a new market comparison and quote.

Preliminary status

All displayed pricing is preliminary. Final pricing, eligibility, network availability, and plan documents are confirmed during underwriting and onboarding. Do not describe an API quote as binding or guaranteed. Quotes expire after the window configured for your partner account, 30 days by default; expiresAt on each quote is authoritative. Enrolling an expired quote returns 410 quote_expired; create a fresh quote.

Quotes in review

A quote goes to underwriting review (status: "in_review") when:
  • its price is not below the benchmark, or
  • a market failed to load.
Group size alone never sends a quote to review. Enrolling an in_review quote returns 409 conflict. Do not show held numbers as final or claim a saving. The iframe shows the monthly premium with no savings claim and, in place of the setup button, “Setup opens once Prescience confirms final pricing for your group.” When underwriting finalizes the quote, the next time the employer opens the iframe it shows the plan with setup available; nothing on your side has to react. To know sooner, watch for quote.finalized (webhook or GET /events) and re-fetch the quote.

Listing and re-fetching

  • GET /groups/{groupId}/quotes lists quotes newest first.
  • GET /groups/{groupId}/quotes/{quoteId} returns one quote.
Asking again for the same census and pricing run returns the quote already made. A changed census or a new pricing run creates a new record, preserving the pricing history. Store and display the returned values rather than recomputing prices.

Interactive materials and PDFs

Current quotes also return materials, with kind, title, pageUrl and pdfUrl for each quote material. Broker keys use page_url and pdf_url. Show the interactive and PDF links alongside the quote; employees can open and forward them without signing in. Plan choices and unknown contributions stay explicit. See Share quote materials for pending and changed-input behavior, plan selection and link validity.