solarOS Organization API

Organization API

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.

/api/v1/quotes/{id}/content/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

quotes:calculateIdempotency-Key required

Parameters

NameInTypeDescription
idrequiredpathstringQuote identifier returned by the Organization API.

Request body

object
FieldTypeDescription
scopeall | pricing | solar | financing | payment_schedule | savings | environmentalOptional unless marked required.
forcebooleanOptional unless marked required.
calculatequotebuildercontentRequest
{
  "scope": "all",
  "force": false
}

Responses

200

Calculation action envelope with confirmationSignal

#/components/schemas/OrgApiActionEnvelope

400

Validation or idempotency error

#/components/schemas/OrgApiError

401

Missing or invalid organization API key

#/components/schemas/OrgApiError

402

Organization billing access or an endpoint-specific business quota denied the request

#/components/schemas/OrgApiError

403

Missing quotes:calculate scope

#/components/schemas/OrgApiError

404

Quote not found

#/components/schemas/OrgApiError

409

Idempotency conflict, QUOTE_DESIGN_LOCKED when the Quote was accepted, or another customer-facing Quote state

#/components/schemas/OrgApiError

429

Rate limit exceeded

#/components/schemas/OrgApiError

Errors

400 Validation or idempotency error401 Missing or invalid organization API key402 Organization billing access or an endpoint-specific business quota denied the request403 Missing quotes:calculate scope404 Quote not found409 Idempotency conflict, QUOTE_DESIGN_LOCKED when the Quote was accepted, or another customer-facing Quote state429 Rate limit exceeded

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}'