solarOS Organization API

Organization API

Record external or staff-mediated Quote acceptance

A service quote on a prepaid plan with no provider funding entered returns 409 CONFLICT with reason PREPAID_FUNDING_MISSING; acceptance does not occur. Hourly quotes return 400 VALIDATION_FAILED for invalid hourly terms, financing, discounts exceeding fixed items, or legacy sourceProjectId add-work-order links; acceptance does not occur. Hourly quotes use quote acceptance instead of installer agreement signing: ON_SIGNING project creation becomes ON_ACCEPTANCE, and MANUAL stays manual. Records acceptance with a required method plus optional accepter identity, notes, and downstream Project/Work Order External References. acceptedAt, acceptedBy, and source are not accepted. When the plan a solar Quote's proposal presents is a PPA or lease, the provider sends its own agreement, so a Project that would wait for the company's signed agreement starts on acceptance instead.

/api/v1/quotes/{id}/mark-accepted

A service quote on a prepaid plan with no provider funding entered returns 409 CONFLICT with reason PREPAID_FUNDING_MISSING; acceptance does not occur. Hourly quotes return 400 VALIDATION_FAILED for invalid hourly terms, financing, discounts exceeding fixed items, or legacy sourceProjectId add-work-order links; acceptance does not occur. Hourly quotes use quote acceptance instead of installer agreement signing: ON_SIGNING project creation becomes ON_ACCEPTANCE, and MANUAL stays manual. Records acceptance with a required method plus optional accepter identity, notes, and downstream Project/Work Order External References. acceptedAt, acceptedBy, and source are not accepted. When the plan a solar Quote's proposal presents is a PPA or lease, the provider sends its own agreement, so a Project that would wait for the company's signed agreement starts on acceptance instead.

Record external or staff-mediated Quote acceptance. Use an organization API key with quotes:accept. Check the response envelope and meta.requestId before triggering dependent workflow steps.

Required scopes

quotes:acceptIdempotency-Key required

Parameters

NameInTypeDescription
idrequiredpathstringQuote identifier returned by the Organization API.

Request body

objectrequired
FieldTypeDescription
methodrequiredVERBAL | EMAIL | IN_APP | SIGNATUREOptional unless marked required.
acceptedByNamestring | nullOptional unless marked required.
acceptedByEmailstring | nullOptional unless marked required.
notesstring | nullOptional unless marked required.
externalReferencesobjectOptional unless marked required.
externalReferences.project[]array<object>Optional unless marked required.
externalReferences.project[].externalSystemrequiredstringOptional unless marked required.
externalReferences.project[].externalObjectrequiredstringOptional unless marked required.
externalReferences.project[].externalIdrequiredstringOptional unless marked required.
externalReferences.project[].metadataobjectOptional unless marked required.
externalReferences.workOrder[]array<object>Optional unless marked required.
externalReferences.workOrder[].externalSystemrequiredstringOptional unless marked required.
externalReferences.workOrder[].externalObjectrequiredstringOptional unless marked required.
externalReferences.workOrder[].externalIdrequiredstringOptional unless marked required.
externalReferences.workOrder[].metadataobjectOptional unless marked required.
markquoteacceptedRequest
{
  "method": "SIGNATURE",
  "acceptedByName": "Ada Lovelace",
  "acceptedByEmail": "ada@example.com"
}

Responses

200

Quote acceptance action envelope

#/components/schemas/OrgApiActionEnvelope

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 required scope: quotes:accept

#/components/schemas/OrgApiError

429

Rate limit exceeded

#/components/schemas/OrgApiError

Errors

401 Missing or invalid organization API key402 Organization billing access or an endpoint-specific business quota denied the request403 Missing required scope: quotes:accept429 Rate limit exceeded

Static examples

curl -X POST "$SOLAROS_BASE_URL/api/v1/quotes/$SOLAROS_QUOTE/mark-accepted" \
  -H "Authorization: Bearer $SOLAROS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SOLAROS_IDEMPOTENCY_KEY" \
  --data '{"method":"SIGNATURE","acceptedByName":"Ada Lovelace","acceptedByEmail":"ada@example.com"}'