List Projects
Lists narrow Project containers inside the organization and linked Property boundary with customFields, Project Scope, and External References. Each Project carries onHold: true while it has an open hold; holds never change status. Supply externalSystem, externalObject, and externalId together to filter by a canonical External Reference. Project Scope (originalScope, currentScope) carries the sale's money only for a key that also has quotes:content:read, the scope that reads it on the Quote: without it, every field typed Currency and every financing fact (apr, dealerFeePercent, financingTerms, paymentSources, financingScenarioName, loan and financing terms, ppaRatePerKwh, financingEscalatorPercent, pricePerWatt, downPayment, upfrontPayment, monthlyPayment, totalCostWithFinancing) is left out, and projectDetails.pricing and its line items' unitPrice, lineTotal and section subtotal are null. Required scope: projects:read; quotes:content:read for the scope money.
Lists narrow Project containers inside the organization and linked Property boundary with customFields, Project Scope, and External References. Each Project carries onHold: true while it has an open hold; holds never change status. Supply externalSystem, externalObject, and externalId together to filter by a canonical External Reference. Project Scope (originalScope, currentScope) carries the sale's money only for a key that also has quotes:content:read, the scope that reads it on the Quote: without it, every field typed Currency and every financing fact (apr, dealerFeePercent, financingTerms, paymentSources, financingScenarioName, loan and financing terms, ppaRatePerKwh, financingEscalatorPercent, pricePerWatt, downPayment, upfrontPayment, monthlyPayment, totalCostWithFinancing) is left out, and projectDetails.pricing and its line items' unitPrice, lineTotal and section subtotal are null. Required scope: projects:read; quotes:content:read for the scope money.
List Projects. Use an organization API key with projects:read. Check the response envelope and meta.requestId before triggering dependent workflow steps.
Required scopes
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| limit | query | integer | Maximum records to return. Defaults to 50 and is capped at 100. |
| cursor | query | string | Opaque record cursor from the previous response meta.nextCursor value. |
| sortDir | query | asc | desc | Sort direction. Defaults to desc. |
| status | query | DRAFT | ACTIVE | COMPLETED | CANCELLED | CLOSED | Filter by Project status. ON_HOLD is no longer a status and is rejected; use onHold. |
| onHold | query | true | false | true lists Projects with at least one open hold; false lists Projects with none. |
| caseId | query | string | Canonical Case membership. Use null for unlinked Projects. |
| customerId | query | string | Filter by Customer id. |
| propertyId | query | string | Filter by Property id. |
| ownerId | query | string | Filter by owner Team Member id. |
| templateId | query | string | Filter by Project Template id. |
| externalSystem | query | string | External Reference system filter. Supply with externalObject and externalId for exact reconciliation lookup. |
| externalObject | query | string | External Reference object filter. Supply with externalSystem and externalId. |
| externalId | query | string | External Reference id filter. Supply with externalSystem and externalObject. |
Request body
This endpoint does not accept a JSON request body.
Responses
Project list envelope
#/components/schemas/OrgApiListEnvelope
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 required scope: projects:read
#/components/schemas/OrgApiError
Rate limit exceeded
#/components/schemas/OrgApiError
Errors
Static examples
curl -X GET "$SOLAROS_BASE_URL/api/v1/projects" \ -H "Authorization: Bearer $SOLAROS_API_KEY"