solarOS Organization API

Organization API

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.

/api/v1/quotes/{id}/aurora-sync

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

quotes:writeIdempotency-Key required

Parameters

NameInTypeDescription
idrequiredpathstringQuote identifier returned by the Organization API.

Request body

object
FieldTypeDescription
auroraDesignIdstringOptional unless marked required.
auroraProjectIdstringOptional unless marked required.
requestquoteaurorasyncRequest
{
  "auroraDesignId": "aurora_design_123",
  "auroraProjectId": "aurora_project_456"
}

Responses

200

Aurora sync request action envelope

#/components/schemas/OrgApiActionEnvelope

400

Validation, idempotency, or missing Aurora identifiers

#/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:write scope

#/components/schemas/OrgApiError

404

Quote not found

#/components/schemas/OrgApiError

409

Idempotency conflict

#/components/schemas/OrgApiError

429

Rate limit exceeded

#/components/schemas/OrgApiError

Errors

400 Validation, idempotency, or missing Aurora identifiers401 Missing or invalid organization API key402 Organization billing access or an endpoint-specific business quota denied the request403 Missing quotes:write scope404 Quote not found409 Idempotency conflict429 Rate limit exceeded

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