Run Quote builder content calculations
Runs the app-equivalent calculation action for Quote builder content. The optional body accepts scope (all, pricing, solar, financing, payment_schedule, savings, or environmental) and force. Solar Quote Types use the solar calculation pipeline; service/general Quote Types use the general pricing pipeline. Requires Idempotency-Key and returns action.confirmed plus action.confirmationSignal so agents can verify the calculation completed before proceeding. A calculation that could not price part of the Quote finishes partial and lists why in result.errors, each with a code — for example MISSING_BASELINE_TERRITORY when the rate bills a baseline allowance and neither the Quote (solar.baselineTerritory) nor the organization names a baseline territory. A Quote for a home that buys generation from a Community Choice Aggregator (solar.generationProviderId) can also report MISSING_PCIA_VINTAGE when its vintage has no PCIA rate on file, NO_GENERATION_RATES when the supplier has no rates for the Quote's rate schedule and vintage, NO_UNBUNDLING when that rate has no generation credits on file, and NO_DELIVERY_EXPORT_VALUES when the rate after solar has no Solar Billing Plan export values for it. Each calculation of a draft re-estimates the year its interconnection application will be filed, so a draft's savings can change when that expected year rolls over. A year set in the solarOS Quote builder is kept until the calendar passes it. An accepted Quote returns 409 QUOTE_DESIGN_LOCKED: its figures are what was sold (409 CONFLICT before 2026-10). Side effects include ActivityLog, quote.content.calculated domain event, idempotency capture, and usage telemetry. Required scope: quotes:calculate.
Runs the app-equivalent calculation action for Quote builder content. The optional body accepts scope (all, pricing, solar, financing, payment_schedule, savings, or environmental) and force. Solar Quote Types use the solar calculation pipeline; service/general Quote Types use the general pricing pipeline. Requires Idempotency-Key and returns action.confirmed plus action.confirmationSignal so agents can verify the calculation completed before proceeding. A calculation that could not price part of the Quote finishes partial and lists why in result.errors, each with a code — for example MISSING_BASELINE_TERRITORY when the rate bills a baseline allowance and neither the Quote (solar.baselineTerritory) nor the organization names a baseline territory. A Quote for a home that buys generation from a Community Choice Aggregator (solar.generationProviderId) can also report MISSING_PCIA_VINTAGE when its vintage has no PCIA rate on file, NO_GENERATION_RATES when the supplier has no rates for the Quote's rate schedule and vintage, NO_UNBUNDLING when that rate has no generation credits on file, and NO_DELIVERY_EXPORT_VALUES when the rate after solar has no Solar Billing Plan export values for it. Each calculation of a draft re-estimates the year its interconnection application will be filed, so a draft's savings can change when that expected year rolls over. A year set in the solarOS Quote builder is kept until the calendar passes it. An accepted Quote returns 409 QUOTE_DESIGN_LOCKED: its figures are what was sold (409 CONFLICT before 2026-10). Side effects include ActivityLog, quote.content.calculated domain event, idempotency capture, and usage telemetry. Required scope: quotes:calculate.
Run Quote builder content calculations. Use an organization API key with quotes:calculate. Check the response envelope and meta.requestId before triggering dependent workflow steps.
Required scopes
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Quote identifier returned by the Organization API. |
Request body
| Field | Type | Description |
|---|---|---|
| scope | all | pricing | solar | financing | payment_schedule | savings | environmental | Optional unless marked required. |
| force | boolean | Optional unless marked required. |
{
"scope": "all",
"force": false
}Responses
Calculation action envelope with confirmationSignal
#/components/schemas/OrgApiActionEnvelope
Validation or idempotency error
#/components/schemas/OrgApiError
Missing or invalid organization API key
#/components/schemas/OrgApiError
Organization billing access or an endpoint-specific business quota denied the request
#/components/schemas/OrgApiError
Missing quotes:calculate scope
#/components/schemas/OrgApiError
Quote not found
#/components/schemas/OrgApiError
Idempotency conflict, QUOTE_DESIGN_LOCKED when the Quote was accepted, or another customer-facing Quote state
#/components/schemas/OrgApiError
Rate limit exceeded
#/components/schemas/OrgApiError
Errors
Static examples
curl -X POST "$SOLAROS_BASE_URL/api/v1/quotes/$SOLAROS_QUOTE/content/calculate" \
-H "Authorization: Bearer $SOLAROS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SOLAROS_IDEMPOTENCY_KEY" \
--data '{"scope":"all","force":false}'