Send Quote holds a solar quote for three more reasons (2026-11-01)
A solar quote with too many expansion batteries, a blank agreement value, or estimated production returns 409 CONFLICT.
Org API, Send Quote (POST /api/v1/quotes/{id}/send): a solar quote is held back with 409 and CONFLICT in three more cases. details.reason says which.
SOLAR_TOO_MANY_EXPANSIONS: the quote has more expansion batteries than its main batteries take. The message names the count, such as "2 Powerwall 3 take up to 6 expansions; this quote has 7." Remove expansions or add a main battery in solarOS, then send again. A battery product with no limit set never triggers this.AGREEMENT_VALUE_BLANK: the installer agreement goes out for signature by itself when the quote is accepted, and it would print a value blank.details.blockerslists each{ code, message }, such as "Customer phone would print blank on the agreement." Set the value withPATCH /api/v1/quotes/{id}/content, or for the customer withPATCH /api/v1/customers/{id}, then send again. A value the agreement prints only on a condition the quote doesn't meet is not counted.SOLAR_PRODUCTION_ESTIMATED: the agreement prints annual production while it is a regional estimate. RunPOST /api/v1/quotes/{id}/content/calculate, then send.
A solar quote that still carries the placeholder text from the starter setup is no longer refused with SOLAR_STARTER_TEXT. It is sent, and warnings lists SOLAR_STARTER_TEXT. A payment schedule still named "Mock Starter Payment Schedule" is covered by the same warning, and SOLAR_STARTER_SCHEDULE_NAME is no longer returned. The request body is unchanged, and service quotes send as before.
An accepted quote's design can't change through the API (2026-11-01)
Update Quote Content and Calculate Quote Content return 409 QUOTE_DESIGN_LOCKED on an accepted quote.
Get a Project's Sold System, and soldSystem on project.created (2026-11-01)
A new endpoint returns the solar system a project was sold with.