Request Aurora sync for a Quote
Requests Aurora sync work for one Quote. Requires Idempotency-Key. The request may provide auroraDesignId and auroraProjectId directly, or the action resolves them: the Quote's Aurora design link (solarOS stores its project beside it, and skips links into an Aurora account the organization no longer connects), else the design the Quote last imported, else the Quote's or its Property's project. The sync request is recorded first — ActivityLog, the quote.aurora_sync_requested domain event and the Idempotency-Key — so it stands whatever the import does, and a client retrying on a timeout gets the recorded request back instead of a second import (designImport { status: in_progress } while the first request is still importing). When the organization has connected Aurora in solarOS, the action then imports the design into the Quote with the organization's default import parts — the same import the solarOS Quote builder runs: arrays, inverters, batteries, battery mode, the design picture and Aurora's production, plus usage and rate plans when the default includes usage, Aurora's system price (as the Quote's fixed price, with Aurora's adders and discounts as adjustment lines) when it includes price, and the plan selected in Aurora's sales mode (matched to the organization's financing options by name) when it includes financing — and reports it in designImport: { status: imported | unchanged, revision, parts, notes } or { status: skipped | failed, reason, message, notes }; notes are what a person should check on the Quote ({ code, message, part }). The import never replaces a person's work or guesses: it is skipped, writing nothing, when a part it would replace was edited in solarOS since the last import (EDITED_IN_SOLAROS), when Aurora marks the design's production out of date (PRODUCTION_NOT_CURRENT), when Aurora prices a battery the design does not have (BATTERY_PRICED_NOT_DESIGNED), when the design is for another address than the Quote's property (ADDRESS_MISMATCH), when a rate plan matches only loosely (RATE_PLAN_UNCERTAIN), when Aurora's price is under the organization's price-per-watt floor (PRICE_BELOW_FLOOR), when a module or battery has no matching product (EQUIPMENT_UNMATCHED), when Aurora has no production for the design (BLOCKED), without quotes:content:write (CONTENT_WRITE_SCOPE_REQUIRED), for a Quote past DRAFT or PENDING_APPROVAL (QUOTE_NOT_EDITABLE), and when Aurora is not connected (AURORA_NOT_CONNECTED). Aurora not answering, or any other failure, reports failed (AURORA_UNAVAILABLE and the like, IMPORT_FAILED). The same design revision imported again is unchanged. Side effects include ActivityLog, quote.aurora_sync_requested domain event, idempotency capture, usage telemetry, and for an import the Quote's solar content, load profile, pricing, financing scenarios and a recalculation. Required scope: quotes:write.
Requests Aurora sync work for one Quote. Requires Idempotency-Key. The request may provide auroraDesignId and auroraProjectId directly, or the action resolves them: the Quote's Aurora design link (solarOS stores its project beside it, and skips links into an Aurora account the organization no longer connects), else the design the Quote last imported, else the Quote's or its Property's project. The sync request is recorded first — ActivityLog, the quote.aurora_sync_requested domain event and the Idempotency-Key — so it stands whatever the import does, and a client retrying on a timeout gets the recorded request back instead of a second import (designImport { status: in_progress } while the first request is still importing). When the organization has connected Aurora in solarOS, the action then imports the design into the Quote with the organization's default import parts — the same import the solarOS Quote builder runs: arrays, inverters, batteries, battery mode, the design picture and Aurora's production, plus usage and rate plans when the default includes usage, Aurora's system price (as the Quote's fixed price, with Aurora's adders and discounts as adjustment lines) when it includes price, and the plan selected in Aurora's sales mode (matched to the organization's financing options by name) when it includes financing — and reports it in designImport: { status: imported | unchanged, revision, parts, notes } or { status: skipped | failed, reason, message, notes }; notes are what a person should check on the Quote ({ code, message, part }). The import never replaces a person's work or guesses: it is skipped, writing nothing, when a part it would replace was edited in solarOS since the last import (EDITED_IN_SOLAROS), when Aurora marks the design's production out of date (PRODUCTION_NOT_CURRENT), when Aurora prices a battery the design does not have (BATTERY_PRICED_NOT_DESIGNED), when the design is for another address than the Quote's property (ADDRESS_MISMATCH), when a rate plan matches only loosely (RATE_PLAN_UNCERTAIN), when Aurora's price is under the organization's price-per-watt floor (PRICE_BELOW_FLOOR), when a module or battery has no matching product (EQUIPMENT_UNMATCHED), when Aurora has no production for the design (BLOCKED), without quotes:content:write (CONTENT_WRITE_SCOPE_REQUIRED), for a Quote past DRAFT or PENDING_APPROVAL (QUOTE_NOT_EDITABLE), and when Aurora is not connected (AURORA_NOT_CONNECTED). Aurora not answering, or any other failure, reports failed (AURORA_UNAVAILABLE and the like, IMPORT_FAILED). The same design revision imported again is unchanged. Side effects include ActivityLog, quote.aurora_sync_requested domain event, idempotency capture, usage telemetry, and for an import the Quote's solar content, load profile, pricing, financing scenarios and a recalculation. Required scope: quotes:write.
Request Aurora sync for a Quote. Use an organization API key with quotes:write. 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 |
|---|---|---|
| auroraDesignId | string | Optional unless marked required. |
| auroraProjectId | string | Optional unless marked required. |
{
"auroraDesignId": "aurora_design_123",
"auroraProjectId": "aurora_project_456"
}Responses
Aurora sync request action envelope
#/components/schemas/OrgApiActionEnvelope
Validation, idempotency, or missing Aurora identifiers
#/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:write scope
#/components/schemas/OrgApiError
Quote not found
#/components/schemas/OrgApiError
Idempotency conflict
#/components/schemas/OrgApiError
Rate limit exceeded
#/components/schemas/OrgApiError
Errors
Static examples
curl -X POST "$SOLAROS_BASE_URL/api/v1/quotes/$SOLAROS_QUOTE/aurora-sync" \
-H "Authorization: Bearer $SOLAROS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SOLAROS_IDEMPOTENCY_KEY" \
--data '{"auroraDesignId":"aurora_design_123","auroraProjectId":"aurora_project_456"}'